Russian Qt Forum

Qt => Общие вопросы => Тема начата: kadr от Октябрь 17, 2009, 19:37



Название: Работа с файлами
Отправлено: kadr от Октябрь 17, 2009, 19:37
Всем привет, помогите мне решить такую проблему!
имеется фаил примерно такого содержания:
8203      Цикло-Прогинова драже х 21                 Schering GmbH und Co. Produktions KG       6         490,97р.    490,97р.     ( ВCE ГРУППЫ )
8204      Фемоден драже х 21                         Schering GmbH und Co. Produktions KG       79        434,52р.    434,52р.     ( ВCE ГРУППЫ )
8207      Ультрапрокт супп. ректал. х 10             Intendis Manufacturing - Италия            11        354,12р.    354,12р.     ( ВCE ГРУППЫ )

Нужно выдернуть из него по отдельности- код, нименование, производителя, количество, цену и группу, для дальнейшей загрузки этого всего в MySQL.
Там куча пробелов, например в названии много пробелов, пытался решить проблему split-ом, но названия имеют разное количество пробелов, такая же ерунда и в производителе!
Посоветуйте, что нибудь!  ???
Да в файле 3500 строк, так что работать ручками не хочется!  ;D


Название: Re: Работа с файлами
Отправлено: BRE от Октябрь 17, 2009, 19:42
Поля точно пробелами разделены? может все таки табуляцией?
Можно попробовать регулярными выражениями, в качестве разделителя между полями использовать 2 и более пробелов.


Название: Re: Работа с файлами
Отправлено: kadr от Октябрь 17, 2009, 19:45
Точно пробелами, с регулярными выражениями у меня пока туговато! Может как нибуть по проще это можно сделать?  ???


Название: Re: Работа с файлами
Отправлено: lit-uriy от Октябрь 17, 2009, 20:03
можно посимвольно читать, больше двух пробелов подряд - разделять


Название: Re: Работа с файлами
Отправлено: Joss от Октябрь 17, 2009, 20:06
1,4,5,6 колонки - начинаются с цифры
7 - со скобки
2 колонка - заканчивается цифрой

Я бы парсил через IndexOf()


Название: Re: Работа с файлами
Отправлено: lit-uriy от Октябрь 17, 2009, 20:06
сейчас скопировал пример в текстовый редактор и увидел:
7 столбцов с фиксированными позициями:
0, 11, 54, 97, 107, 119, 132


Название: Re: Работа с файлами
Отправлено: kadr от Октябрь 17, 2009, 20:12
Я пытался читать посимвольно, но тоже не то, я не могу заставить программу понимать что там больше 2 пробелов!
 while (!file_r.atEnd())
    {
        str = file_r.readLine().trimmed();
        i = 0;
        while (i != str.length())
        {
            if (str.at(i) != ' ')
            {
               str2.append(str.at(i)).trimmed();
            }
            else
            {
                while (str.at(i) ==' ')
                {
                    i++;
                }
                i--;
            }
            i++;
        }
От того что там не будет пробелов вообще мне не лучше, как то надо заделить данные, а без пробелов вообще получиться одна большая строки и что мне с ней делать! Было бы замечательно если бы за место пробелов там где нужно поставить знак какойнибудь, например |, можно было бы тогда воспользоваться split-ом, но он мне и в названиях товара, где есть пробел, соответсвенно наставил этих знаков!


Название: Re: Работа с файлами
Отправлено: kadr от Октябрь 17, 2009, 20:16
1,4,5,6 колонки - начинаются с цифры
7 - со скобки
2 колонка - заканчивается цифрой

Я бы парсил через IndexOf()
А по подробнее можно про это! как это можно осуществить,  indexOf() возвращает индекс символа или подстроки если они найдены! Как мне это поможет!
Да во второй колонке не все названия заканчиваются цифрой, а 7 начинается  не только со скобки!


Название: Re: Работа с файлами
Отправлено: Joss от Октябрь 17, 2009, 20:31
А в Excel не засунуть это?
В некоторых редакторах есть выделение столбцов, в том же MSVC - не поможет?

Вообще вопрос надо перенести, это не Qt, это алгоритмы.
А автор выдает неполную информацию, поэтому помочь невозможно. Полноценный пример в студию...


Название: Re: Работа с файлами
Отправлено: kadr от Октябрь 17, 2009, 20:37
Дело в том что я в QT совсем недавно, поэтому много не знаю! Разве QT работает с exele? Какой информации не хватает? Я же говорю, что надо из файла текстового выдернуть определнные данные, вот и интересуюсь, как это можно сделать, просто сам никак не пойму как сделать!


Название: Re: Работа с файлами
Отправлено: Joss от Октябрь 17, 2009, 20:49
1. Тема не для этой ветки, это не Qt.
2. Excel... там есть VusialBasic, можно легко обработать формы, сконвертировать так, как нужно.
3. Информации не хватает - файла самого. Вы же приводите пример, к которому дают конкретные алгоритмы, оказывается есть множество исключений и эти алгоритмы не подходят.

Совет - если нет возможности алгоритмизировать, ищите обходные пути. Может файл вообще в Excel можно получить, может вручную отформатировать.


Название: Re: Работа с файлами
Отправлено: BRE от Октябрь 17, 2009, 21:21
Да все просто:
Код
C++ (Qt)
       QStringList lst = str.split( QRegExp( "\\s{2,}" ) );
       qDebug() << lst;
 

Вывод:
("8203", "Цикло-Прогинова драже х 21", "Schering GmbH und Co. Produktions KG", "6", "490,97р.", "490,97р.", "( ВCE ГРУППЫ )")


Название: Re: Работа с файлами
Отправлено: kadr от Октябрь 18, 2009, 15:59
Да все просто:
Код
C++ (Qt)
       QStringList lst = str.split( QRegExp( "\\s{2,}" ) );
       qDebug() << lst;
 

Вывод:
("8203", "Цикло-Прогинова драже х 21", "Schering GmbH und Co. Produktions KG", "6", "490,97р.", "490,97р.", "( ВCE ГРУППЫ )")

Спасибо, гараздо так проще, но беда как говориться не приходит одна, в файлике также содержаться строки такого содержания:
680000527 Хумулин НПХ картрид.100МЕ/мл 3 мл х 5      Eli Lilly                                  3         1440,76р.   1440,76р.    ( ВCE ГРУППЫ )
и там к сожалению после кода всего один пробел, и выражение уже не срабатывает, буду думать что с этим можно сделать!  :)


Название: Re: Работа с файлами
Отправлено: lit-uriy от Октябрь 18, 2009, 16:45
>>буду думать что с этим можно сделать!
Я тебе написал вариант и он соответствует последнему примеру.


Название: Re: Работа с файлами
Отправлено: Igors от Октябрь 19, 2009, 09:39
и там к сожалению после кода всего один пробел, и выражение уже не срабатывает, буду думать что с этим можно сделать!  :)
Никто не сможет придумать 100% корректное решение для некорректных/неопределенных данных (как в данном случае). Разбирайте как предложено выше и ловите ошибки (например, или поле не переводится в число или получается слишком много полей и.т.п.). Ошибочную строку исправляете в текстовом редакторе и повторяете процедуру. Не очень креативно но задачу решает  :)


Название: Re: Работа с файлами
Отправлено: Rcus от Октябрь 19, 2009, 09:57
Все корректно. Это fixed-column формат данных. (Чтобы догадаться достаточно включить моноширинный шрифт)