| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Считывание текстового файла сложной структуры |
| Автор: Pellegrino 28.1.2010, 23:06 |
| Уважаемые, столкнулся с такой непростой задачкой, как работа с текстовым файлом сложной структуры. Нужно считать с него коды станций, номера платежей, суммы и коды статей. И дату. Желательно в табличку запихнуть для удобства работы. Единственный вариант, который приходит в голову, это построчное считывание и анализ. Подскажите какими методами такое можно провернуть? |
| Автор: Данкинг 28.1.2010, 23:12 |
Так грузи в Memo, а дальше парси всякими строковыми функцями вроде "copy". |
| Автор: Pellegrino 29.1.2010, 17:59 |
| Файл менять не могу и структуру тоже. Данные нужны для БД. Конкретно привязать не могу именно к copy, так как длина названий везде разная и это только 1\5 файла. А как сделать чтобы записывал только суммы из строк со словами "по станции"? |
| Автор: chip_and_dayl 29.1.2010, 20:35 |
| Значить алгоритм, приблизительно такой. 1. Загружаем/открываем текстовой файл 2. Ищем строку "по станции" (ф-ций поиска хватает) 3. Запоминаем номер строки и запускаем поиск уже по строке, в которой нашли слово "по станции" 4. Заносим сумму в базу 5. Ищем следующую строку, где находиться слово "по станции" Добавлено @ 20:40 Тут вопрос может возникнуть только в пункте 3. Как искать!?! Или тупым перебором, то есть каждую строку анализировать на символ "|" и когда, мы найдем в строке второй символ "|", то мы знаем, что за вторым символом уже идет желаемая сумма, то мы откидываем пробелы и заносим сумму в базу. Второй вариант, найти ф-цию поиска, которая ищет по шаблону |
| Автор: Pellegrino 29.1.2010, 21:28 |
| Вот у меня была идея искать на подобе какойнить маски. |
| Автор: Демо 29.1.2010, 22:55 |
| Так вроде нет никаких проблем разобрать файл. Конечный автомат - стандартный алгоритм. |
| Автор: kami 30.1.2010, 01:11 | ||
| Я чего-то возможно не понимаю, но не вижу никакой проблемы разобрать этот файл. Длина строки - фиксированная. Длина каждой ячейки - тоже. Функции copy вместе с trim хватит с головой и даже больше... Если я правильно понял структуру файла, то:
|
| Автор: Pellegrino 1.2.2010, 14:00 |
| Круто, спасибо. А как добавить еще коды платежей и суммы по ним? Еще вопрос, что за регулярные выражения, они могут тут помочь? А в данные из типа рекорд можно в стингГрид укладывать? |
| Автор: profesiachuvak 1.2.2010, 17:45 |
Обращаться к fields (полям) записи и выводить их в StringGrid. |
| Автор: kami 1.2.2010, 18:49 | ||
Не понял вопроса, или Вы не читали мой ответ. Stations[i].Pays[j].Code и Summ - это разве не то, что нужно? Строка платежа разбирается полностью по всем колонкам за исключением порядкового номера.
Не ко мне. Более чем можно, и к этому нет никаких препятствий. Только давайте так - решать за Вас Вашу задачу здесь, имхо, не будут. За этим - в "Центр Помощи". С учетом того, что я и так сказал больше, чем нужно было, предлагаю следующее - Вы попробуете сами перенести данные из записей в StringGrid. Если что-то не получится - с конкретным вопросом и своим "работающим не так, как нужно" кодом - пожалуйста сюда. |
| Автор: Pellegrino 1.2.2010, 21:50 | ||
Дату я забрал, правда, может и не самым красивым способом. Подозреваю, что косяки еще могут меня встретить.
|
| Автор: kami 1.2.2010, 23:37 | ||
Код с моими комментариями:
Замечание не по теме - для удобства чтения другими вашего кода, неплохо было бы оформлять его, придерживаясь правил, принятых у создателей VCL. Да и обзывать компоненты лучше осмысленными именами, чтобы не пришлось мучительно искать - "а что же отображает Edit94 на Form31". |
| Автор: Pellegrino 2.2.2010, 22:16 |
| По моей задумке пользователь вводит год в эдите3 и выбирает месяц из комбоБокса, а после я захватываю дату и сравниваю её с введенным, если нет совпадения, то вывожу сообщение об ошибке ввода и блокирую кнопку записи в БД. А как до 6 строки пролистать - for i:=0 do 5 then таким образом? Еще проблема возникла в том, что версия проги выбрасывающая отчет сменилась, и изменился отчетный файлик. В нем три вида отчетов, мне нужны станции с кодами платежей и цифрами по ним по ФО-7л и ФО-7н, Фо-7М не нужно. Возникла идея разбить на два текстовика с нужным содержим по Фо-7л и Н, а как можно определять начало и концовки их? |
| Автор: kami 2.2.2010, 22:31 | ||
|
| Автор: Pellegrino 3.2.2010, 20:36 | ||
Решил просто перебирать тупо строки и писать в StringGrid. По задумке должно было писать все строки начинающиеся с символа "|", но чет не очень вышло, пишет только три первых столбца и заполняет чушью.
|
| Автор: kami 4.2.2010, 00:21 | ||||
Естественно. Поставьте брейкпоинт на начало обработчика кнопки и пройдитесь в ней по F8. Наводя курсор на переменную buf на каждой строке Вы поймете, где ошибка. Навскидку - сперва нужно считывать очередную строку в буфер, а уже потом с ней работать - у функции copy второй параметр - с какого символа начать копирование, а третий - количество копируемых символов. Вы же не хотите сказать, что "статья" занимает 127 символов?
И еще раз повторюсь -
Если это не по силам, скачайте и установите http://www.aew.wur.nl/uk/delforexp/. После установки нажав Ctrl+D (в среде Delphi, естественно) и Enter Вы удивитесь, как код преобразится к читабельному виду. |
| Автор: Pellegrino 4.2.2010, 09:43 |
| Я в нете с телефона, но постараюсь выложить оформленный код. С символами до меня уже доперло. Заполняются только первые три колонки, что странно. ТАблица так же заполняется мусором, есть 4 значения, по которым надо строки удалять. А вот как удалять строки в Гриде по значению ячейки? Можно табличку плотней сбить, а то много пустых позиций. Еще вопрос не везде есть имя станции папротив станции, каким алгоритмом доставить туда соотвествующие имена? Спасибо за подсказку про ф8, сразу нашел в чем косяк. Прошу не судить меня строго, так как я недавно начал... |
| Автор: kami 4.2.2010, 16:12 | ||||||
Может быть, в строке меньше 107 символов, поэтому не отрабатывают? А точнее - отрабатывают, но в результате выдают пустую строку?
Может, просто перед занесением в таблицу, смотреть - мусор в буфере или нет, и если мусор - сразу переходить к чтению другой строки? типа так:
в своем коде по первому варианту файла я делал так: при разбиении строки определял, что это - конкретный платеж или итог по станции. Если конкретный платеж, то: если имя станции в текущем буфере <> '', то запоминаем имя станции заносим буфер "куда надо". Если имя станции из текущего буфера ='', то вставляем вместо него запомненное. Да вроде никто и не пытается. |
| Автор: Pellegrino 4.2.2010, 22:21 | ||
| Чет с именем не все понятно с имена станций... вот так я наворотил, конечно не айс, но работает...
|
| Автор: Pellegrino 5.2.2010, 21:52 | ||
Разобрался я с имена и пустыми строками. Спасибо за подсказки! Вот мой код, конечно не самый оптимальный, но работает! Если есть предложения по оптимизации буду рад! Вот такой вопрос, а как наложить маску ввода на Едит, точнее мне нужно чтобы было только 4 символа и те только цифры, ну типа год. И организовать проверку на заполненность его корректным способом?
|
| Автор: kami 5.2.2010, 22:29 |
SpinEdit с MinValue=1900 и MaxValue=9999 или MaskEdit с маской !0000;1;0 |
| Автор: Pellegrino 8.2.2010, 18:27 | ||
Еще один маленький вопросик. Надо в табличку положить коды станций, но чет они у меня не хотят вставать как нужно и "размножаться". И еще как заставить стринггрид заполняться строка в соответствии с записями, а то я руками вбухал 200, что не есть хорошо. Во второй грид гружу по выборке.
|
| Автор: kami 8.2.2010, 20:00 | ||
Вы выкладываете кучу кода. Не оформленного вообще. И хотите, чтобы в нем кто-то пытался разобраться? Да через 2 недели Вы сами не поймете свой код. Пощадите нервы и время отвечающих, хотя бы акцентируйте внимание на уровне вложенности операторов. |
| Автор: Pellegrino 8.2.2010, 20:51 | ||
с этим, кстати проблемы у самого начались... А как пользоваться вот DelForExp?
|
| Автор: Pellegrino 10.2.2010, 08:22 |
| У меня коды станций запаздывают на одну станцию. Кокой алгоритм должен бы на замещение текущего элемента следующим? При этом первый сместить в начало таблицы? |
| Автор: Rennigth 10.2.2010, 09:02 |
| Pellegrino, kami правильно говорит, просто нехочеться даже рассматривать Ваш код. Пожалуйста, почитайте хоть эту статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=802 Поверьте, Вам с большем желанием будут помогать. |