конвертировать txt-файл в csv, разделенный вкладками

Извините, люди, которых я новичок в Linux, и пока я просматривал список ответов на вопросы, я не знаю достаточно, чтобы узнать, был ли ответ на мой вопрос. Или, если я смогу адаптировать один из ответов на мою небольшую проблему.

Я получаю текстовый файл данных от моего босса, который научился использовать компьютеры в одну сторону; и он не изменится. Данные - это почти csv-файл, за исключением того, что все поля разделены пробелами, а не запятой или символом табуляции. И текстовые поля данных также включают в себя встроенные пространства.

Каждое поле является либо числом, либо числом и текстом, все поля имеют разную длину, и ни одна из них не установлена ​​с одинарными или двойными кавычками. Поля чисел преобладают, и никакое текстовое поле не смежно с любым другим текстовым полем. Редко представляет собой внедренное число в текстовое поле, которому предшествует символ пробела или сопровождается символом [пробел].

К сожалению, не каждый символ [пробел] можно просто заменить. Вместо этого, потому что, как правило, разрывы полей имеют форму либо [пробел] [0-9], либо [0-9] [пробел], так я определяю, следует ли преобразовать символ [пробел] в [tab] характер или нет. Если символ [пробел] находится рядом с цифрой, его нужно преобразовать в символ [tab].

Таким образом, используя функцию «Найти / заменить» в «Блокноте для Windows», я ищу пробел или пробел -digit, преобразуя этот символ [пробел] в символ [tab]. Я должен сделать это десять раз [0-9] [пробел], а затем еще десять раз [пробел] [0-9]. Я ищу сценарий, чтобы сделать это автоматически.

Вот пример файла, который я получаю. Он содержит четыре поля, разделенных символами [пробел] (первая строка). Каждая следующая строка - одна запись, поэтому вторая строка - первая запись. Account - 2281, Units - 19, Description - Toshiba PX-1982GRSUB {, и, наконец, поле Delta содержит 0:

Account Units Description Delta  
2281 19 Toshiba PX-1982GRSUB 0  
9618 200 HP MX19942-228b -25  
19246 4 CompuCom HD300g Hard Drive 4

Итак, что Я ищу сценарий, который будет читать исходный файл, преобразовать символы [пробел], которые являются разделителями полей, в символы и записать все это в новый файл. И я хочу объяснение, поэтому я не буду снова и снова задавать одни и те же вопросы.

1
задан 25 January 2016 в 16:14

1 ответ

Хорошо, поэтому вам нужно заменить первые два и последнее место в каждой строке запятой. Вы не можете просто заменить каждое пространство, потому что 3-е поле может содержать пробелы. Вы можете сделать это с заменой регулярных выражений. Вот сценарий / команда sed, которая работает:

sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/\1,\2,\3,\4/' in.txt > out.csv

В приведенном выше примере это возвращает:

Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4

Это все еще довольно хрупко с обработкой пустых полей и разрывов полностью, если столбцы, отличные от третьего, содержат пробелы. Очень легко ввести такие искаженные данные, если они отформатированы вручную, как это сделал ваш босс. Вы должны предложить ему перейти на более надежный формат таблицы (например, правильный CSV & amp; Co) и редактор (общие инструменты распространения листа могут работать с CSV довольно хорошо и гибко, например LibreOffice / OpenOffice Calc, Microsoft Excel и Google Docs).

0
ответ дан 23 May 2018 в 14:08
  • 1
    Вау! Действительно мило. Спасибо. Это намного лучше, чем я, и у меня есть куча вещей, чтобы посмотреть и выяснить. – Bobby H. 26 January 2016 в 01:52
  • 2
    Поскольку вы репутация 3 пользователя: если вы предпочитаете этот ответ, вы можете выбрать его как принятый ответ вместо принятого в настоящее время ответа. – David Foerster 26 January 2016 в 03:13
  • 3
    Дэвид - извините меня, чтобы понять, что сделала ваша команда. Он прекрасно работает для четырех текстовых файлов. К сожалению, я получаю текстовые файлы с переменным количеством полей, поэтому я бы тоже просмотрел его, чтобы определить количество полей и либо изменить сценарий, либо отправить ему переключатель для установки количества полей. Решение, которое я выбрал, будет работать независимо от количества полей. Но ваша команда намного красивее, чем мой код; и компактно. Все еще думая, как я могу empamnet ваш код в моем решении, хотя .. Еще раз спасибо вам и всем остальным - B – Bobby H. 2 February 2016 в 05:46
  • 4
    Как структурируются дополнительные поля? Можете ли вы расширить свой вопрос описанием новых требований? Или еще лучше, задайте следующий вопрос, относящийся к этому. Возможно, было бы лучше спросить об этом на Stack Overflow , где вы получите гораздо более широкую аудиторию для своей независящей от платформы проблемы обработки текста, поскольку вам не нужен язык программирования (сценарий оболочки, sed, Awk, Perl, Python ...). – David Foerster 2 February 2016 в 11:26

Другие вопросы по тегам:

Похожие вопросы: