Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VC#] Разделение/Обработка строки, Необходимо разделить содержимое строки 
V
    Опции темы
MuForum
  Дата 29.6.2008, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброе время суток!
- Столкнулся со следующей проблемой.
- Необходимо Обработать файл, в котором находиться информация о игровых монстрах. (Параметры/Настройки)
- Считываю осуществляю в компонент 'RichTextBox', затем по одной строке обрабатываю и записываю в таблицу 'DataGridView'.
- В каждой строчке 28 параметров, которые необходимо обработать и сохранить.
- Проблема заключается в грамотном разделение строки.

# Содержимое файла:
Код

0    1    "Bull Fighter"    6    150    0    23    29    8    0    35    6    3    0    1    5    400    0    10    2    130    10    2    0    0    0    0    0
1    1    "Hound"    9    170    0    35    45    12    0    50    9    3    0    1    5    400    1600    10    2    130    10    2    0    0    0    0    0
2    1    "Budge Dragon"    4    90    0    15    23    6    0    25    3    3    0    1    4    400    2000    10    2    120    10    2    0    0    0    0    0
3    1    "Spider"    5    50    0    8    12    2    0    15    1    2    0    1    5    400    1800    10    2    120    10    2    0    0    0    0    0
4    1    "Elite Bull Fighter"    12    230    0    45    54    14    0    70    12    3    0    1    4    400    1400    10    2    140    12    2    0    0    0    0    0
...
end


- Задача усложняется из-за 3 параметра, так как необходимо считать данные из двойных кавычек(Строковой тип данных).
- Также разделителем может быть как символ табуляции '\t', так и простой пробел. (Так же могут быть несколько пробелов подрят)


# Осуществил следующим образом:
Код

        public void ReadFromFile()
        {
            rtb_main.Invoke((MethodInvoker)delegate
            {
                rtb_main.Clear();
                rtb_main.Text = File.ReadAllText(_mySettings.FileName, Encoding.UTF8);
                // ----
                dgv_main.Invoke((MethodInvoker)delegate
                {
                    dgv_main.Rows.Clear();
                    dgv_main.Visible = false;
                    // ----
                    string T = "";
                    int j = 0;
                    // ----
                    int[] k = new int[2];
                    int p = 0;
                    int k1 = 0;
                    int z = 1;
                    string delimStr = " \t";
                    char[] delimiter = delimStr.ToCharArray();
                    string words = string.Empty;
                    string[] split = null;
                    int x = 0;
                    // ----
                    for (int i = 0; i < rtb_main.Lines.Length; i++)
                    {
                        T = "";
                        T = rtb_main.Lines[i];
                        if (T.Length > 0)
                        {
                            dgv_main.Rows.Add();
                            dgv_main.Rows[j].Cells[0].Value = (j + 1);
                            if ((T.Contains("end") == false) && (T.Contains("//") == true))
                            {
                                dgv_main.Rows[j].Cells[1].Value = T;
                            }
                            else if ((T.Contains("end") == true) && T.Length == 3)
                            {
                                dgv_main.Rows[j].Cells[1].Value = "end";
                            }
                            else if ((T.Contains("//") == false) && ((T.Contains("0") == true) || (T.Contains("1") == true) || (T.Contains("2") == true) || (T.Contains("3") == true) || (T.Contains("4") == true) || (T.Contains("5") == true) || (T.Contains("6") == true) || (T.Contains("7") == true) || (T.Contains("8") == true) || (T.Contains("9") == true)))
                            {
                                k1 = 0;
                                p = 0;
                                while (k1 < 2 && p < T.Length)
                                {
                                    if (T[p] == '\"')
                                    {
                                        k[k1] = p;
                                        k1++;
                                    }
                                    p++;
                                }
                                // ----
                                z = 1;
                                words = T.Substring(0, k[0]);
                                x = words.Length;
                                split = words.Split(delimiter, x);
                                foreach (string s in split)
                                {
                                    if (s.Length > 0)
                                    {
                                        dgv_main.Rows[j].Cells[z].Value = s;
                                        z++;
                                    }
                                }
                                // ----
                                dgv_main.Rows[j].Cells[z].Value = T.Substring(k[0] + 1, k[1] - k[0] - 1);
                                z++;
                                // ----
                                words = T.Substring(k[1] + 1, T.Length - k[1] - 1);
                                x = words.Length;
                                split = words.Split(delimiter, x);
                                foreach (string s in split)
                                {
                                    if (s.Length > 0)
                                    {
                                        if (z < 29)
                                        {
                                            dgv_main.Rows[j].Cells[z].Value = s;
                                            z++;
                                        }
                                        else break;
                                    }
                                }
                            }
                            j++;
                        }
                    }
                    // ----
                });
            });
        }


- Алгоритм тупее не бывает, сам понимаю. (Не оптимизировал и не улучшал, так как сам метод не нравиться)

Это сообщение отредактировал(а) MuForum - 29.6.2008, 01:57


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
MuForum
Дата 29.6.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Я хотел реализовать через коллекцию, чтобы всё туда записывалось, но не получилось, так как выборки каждый раз делать глупо.
Код

        private List<TFileInfo> FileList = new List<TFileInfo>();
        private class BoR_FileInfo
        {
            public int a1 = 0;
            public int a2 = 0;
            public string a3 = string.Empty;
            ...
        }

- Но будет глупо каждый раз делать выборку, нужно коллекция тогда, Чтобы обращаться по индексу к значению. (Но я такой не знаю)


- По сути нужна какая-то отдельная таблица в которую будет сохраняться обработанная информация.
- А саму строчку обрабатывать по одному элементу тогда в цикле while().
- Умнее я пока ничего придумать не смог.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Baa
Дата 29.6.2008, 14:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 1
Всего: 12



Код

string t = "0 1    \"Bull Fighter\"\t6\t150 0    23    29    8    0    35    6    3    0    1    5    400    0    10    2    130    10    2    0    0    0    0    0";
Regex r = new Regex(@"(""[^""\\]*[\\.[^""\\]*]*"")|([\x20\t]+)");

foreach (string k in r.Split(t).Where(element => element.Trim().Length > 0))
{
                Console.WriteLine(k);
}


Сорри, в регулярных выражениях не очень силен, можно элементы с пробелами как-то сразу убрать.
Соотв. это применить для каждой строки.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Magnifico
Дата 29.6.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: нет
Всего: 17



задачка интересная ,вроде разделил твою строку
Код

Hashtable options = new Hashtable();
string str = "0    1  \t  Bull Fighter \t\t   6  \t\t\t  150    0    23    29    8    0    35    6    3    0    1    5    400    0    10    2    130    10    2    0    0    0    0    0";

     //---заменяем пробелы и \t  на один пробел-----
    str = new Regex("\\s+", RegexOptions.Compiled).Replace(str, " ");
     int startPos = 0, endPos = 0, i =0;
            while(true)
            {
                endPos = str.IndexOf(' ',startPos); //--находим позиц пробела
                if (endPos == -1) //нет больше пробелов
                {  
                   // -- берем последнюю букву
                    options.Add(i, str.Substring(startPos, str.Length - startPos));
                    break;
                }
                //берем символы начиная со startPos  и длинной endPos - startPos
                options.Add(i, str.Substring(startPos, endPos - startPos));
                startPos = endPos+1;
                i = i + 1;
            }
            //-----перебор хеш таблицы----------
       foreach (int key in options.Keys)
          label1.Text += '\n' + "" + key + "  " + options[key].ToString();
        //----обращение по ключю-----
         MessageBox.Show(options[1].ToString());



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Bishop
Дата 29.6.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



MuForum,
Разделить строку на части:
Код

string s = @"1    1    ""Hound""    9    170   …";
string[] a = s.Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); // поделили
int val0 = Convert.ToInt32(a[0]); // числа
string sval = a[2].Trim(@"""".ToCharArray()); // строка

Прочитать текстовый файл в массив строк:
Код

System.IO.StreamReader t = new System.IO.StreamReader("TestFile.txt"));
string f = t.ReadToEnd();
string[] s = f.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

PM WWW ICQ   Вверх
Baa
Дата 30.6.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 1
Всего: 12



Не забывайте, что третий параметр - это ОДНО значение. Т.е. "Bull Fighter" - это не Bull и Fighter, а именно "Bull Fighter".


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Bishop
Дата 30.6.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



Baa, точно, ну тогда вот так:
Код

string[] parts = s.Split(@"""".ToCharArray());
string sval = parts[1].Trim(@"""".ToCharArray()); // строка
string[] vals = (parts[0] + parts[2]).Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
int val0 = Convert.ToInt32(vals[0]); // числа

PM WWW ICQ   Вверх
Magnifico
Дата 30.6.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: нет
Всего: 17



Bishop -  молодец  на vb6 таких преблуд не было
Код

s.Split(@"""".ToCharArray())

 (привык к цикличекому перебору - возьму на вооружение)


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
MuForum
Дата 2.7.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(Bishop @ 30.6.2008,  11:07)
Baa, точно, ну тогда вот так:
Код

string[] parts = s.Split(@"""".ToCharArray());
string sval = parts[1].Trim(@"""".ToCharArray()); // строка
string[] vals = (parts[0] + parts[2]).Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
int val0 = Convert.ToInt32(vals[0]); // числа

Благодарю за помощь.

P.S. -> Спасибо всем кто участвовал.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0929 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.