Patrick07 Ответов: 3

Манипуляция с текстовыми файлами


Привет, у меня возникла проблема с txt-файлом. Мне нужно отредактировать его так, чтобы каждый раз, когда файл видит 16 451, он заменяет его на 16 475

Кроме того, мне нужно заменить подчеркнутые 0 жирными цифрами.

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

Как только я придумаю, как это сделать, мне нужно будет сделать это с 220 файлами. Любая и всякая помощь очень ценится.


исходный файл:
16,451,13039,,42,0,ОБРАЩАЮТ РЕФ ОБСЛУЖИВАНИЕ*УП*6416*Народный Газ
49,2460
98,24607
02,104
03,13100
16,451,16228,,42,0/
88,PAY PAY SERVICE REF*CK*6414*Содружество Эдисон
16,451,123750,,42,0/
88,PAY PAY SERVICE REF*CK*6415*Лизинг
49,2799
98,27995

Что мне нужно:
16,475,13039,,42,6416,ОБРАЩАЮТ РЕФ ОБСЛУЖИВАНИЕ*УП*6416*Народный Газ
49,2460
98,24607
02,104
03,13100
16,475,16228,,42,6414/
88,PAY PAY SERVICE REF*CK*6414*Содружество Эдисон
16,475,123750,,42,6415/
88,PAY PAY SERVICE REF*CK*6415*Лизинг
49,2799
98,27995

Что я уже пробовал:

Я пробовал кое-что поменьше, но ничего из того, что я знаю, не работает.

Garth J Lancaster

Я вижу, вы обновили его - я мог бы пропустить, что данные для этого 16,475,16228, 42,6414 появляется в строке 'ниже', т. е '88' линии ... не исключено, что это невозможно объяснить, в зависимости от того, сколько строк находится в файлах в среднем

3 Ответов

Рейтинг:
20

Garth J Lancaster

основная идея, как сказал OriginalGriff, использовать читатель CSV или даже разделение строк

Вы не указали язык программирования - кто-нибудь для awk ? вы также не указали, сколько строк имеет файл(ы) (или это так, как показано на рисунке)

Логика "выглядит как" (ТМ, не доказано)

1) Выберите язык, который вам удобен
2) получить список необходимых файлов - по имени или "в каталоге"
3) для каждого файла откройте новый выходной файл, откройте (входной) файл и прочитайте его строка за строкой
4) если строка начинается с "16", проверьте наличие двух нижеприведенных условий, иначе запишите ее дословно в выходной файл
5) "разбить" строку на основе ','
6) 1-е условие : предполагая смещение на основе нуля/0, если строка имеет элемент[0] == 16 и элемент [1] == 451 и количество элементов == 6, а элемент [5] != '0', разделите элемент [5] на '*' и удерживайте элемент [2].. это 6416 из первой строки
7) Затем вы можете установить элемент [1] линейного массива в '475', а элемент [5] в элемент [2] из второго разделения из точки 6 и записать этот массив в новый файл, используя 'join' и ', конечно, с Терминатором C/R
8) 2-е условие : если строка имеет элемент[0] == 16 и элемент [1] == 451 и количество элементов == 6, а элемент [5] == '0', вы заменяете элементы [1] & [5], Элемент [1] на '475' и элемент [5] с сохраненным 2-м разделенным значением, например '6416', и записываете этот массив в новый файл, используя 'join' и', ' с Терминатором C/R, конечно
9) закройте файл (или в C# используйте "использование блоков" вокруг входных и выходных файлов)

[Edit] чтобы сделать вашу программу проще, создавайте ее поэтапно, например
Этап 1 : получите список файлов, которые вам нужно обработать, зациклить и отобразить на консоли
Этап 2 : Используйте первый файл - откройте его, прочитайте его строка за строкой, запишите его нетронутым строка за строкой в новый файл
Этап 3 : Измените этап 2, чтобы сделать правки - таким образом, вы можете быть уверены, что все, что раньше работало
[/Редактировать]


Maciej Los

5ed!

Patrick07

Таким образом, каждая из этих операций является транзакцией. Если транзакция не помещается в одну строку, она начнет следующую строку с 88, (остальная часть транзакции). Иногда вся транзакция находится на одной линии, а иногда-на двух линиях. Возможно ли построить что-то, что может это обнаружить? Сколько это будет стоить для кого-то, чтобы закодировать что-то, чтобы сделать это?

Garth J Lancaster

Я думаю, что вы упускаете суть CodeProject - мы не являемся сайтом по найму кодеров - их там много - мы помогаем людям писать код ... но даже если бы вы обратились к программисту по найму, вам пришлось бы предоставить надлежащие "требования" с анализом ваших данных, что вы не очень хорошо сделали здесь-вы могли бы поместить этот комментарий о " 88 " в свой вопрос, например, и сделать жизнь проще.

Вы не ответили на вопрос, который я задал вам о том, насколько велики/много строк есть в файлах - еще одна жизненно важная часть информации, которая может сделать стоимость дешевой или дорогой

Мой ответ на этот вопрос будет "да", это можно сделать, но может стоить "много" ..

Есть ли название для этого формата данных ? (или, откуда он берется - североамериканские коммунальные компании ??)
Где эти файлы ? все в одном каталоге или разбросаны ?
Как выглядят имена файлов ?
Насколько велики файлы/сколько в них строк ?

Рейтинг:
1

Maciej Los

Замечания:

1.

Цитата:
каждый раз, когда файл видит 16 451, он заменяет его на 16 475

До тех пор, пока ... ,'(запятая) будет использоваться в качестве разделителя, любой парсер вернет два числа: 16 и 451 вместо одного: 16,451.

2.
Цитата:
Мне нужно заменить подчеркнутые 0 жирными цифрами

Текстовый файл не содержит никакой информации о форматировании текста! Таким образом, даже если вы добавите в него html-теги, он будет отображать ноль, окруженный html-тегами: <b>0</b> Для отображения форматированного текста вам потребуется преобразовать текстовый файл в html или rtf-файл.


Рейтинг:
0

OriginalGriff

Нет автоматического способа сделать это, и данные, которые вы показываете, не дают достаточной информации для создания надежного приложения, чтобы делать то, что вы хотите: некоторые из ваших жирных цифр не имеют очевидного "0" для замены. "слепая замена" "16.451" на "16.475" также может привести к ошибкам, поскольку это может быть подстрока другого значения: например, "116.451".

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

Затем я бы использовал библиотеку чтения CSV и написал относительно простое приложение для изменения данных.
Это может помочь: Быстрый читатель CSV[^]