Конвертировать TXT-файл в CSV, разделенный вкладками

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

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

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

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

Поэтому, используя функцию "Найти / Заменить" в "Блокноте" для Windows, я ищу комбинацию цифр-пробел или пробел-цифра, преобразуя этот символ [пробел] в символ [табуляция]. Я должен сделать это десять раз [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

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

2 ответа

Решение

Поиск "заменить пробел через запятую" в Интернете был очень плодотворным, разве это не сработало для вас первым? Нашел бы много ответов, как это:

tr ' ' ',' < input > output

или для вкладок:

tr '\t' ',' < input > output

а также

sed 's/\s\+/,/g' input > output

\s класс пространства (например, [:space:]) и должен заменять любые прогоны (+ (экранированный) = один или несколько предшествующих символов) пробелов, табуляции или новых строк. Этот следующий заменит только один пробел или табуляцию одной запятой (как при запуске обоих выше trх)

sed 's/[ \t]/,/g' input > output

А также -i редактирует файл на месте (непосредственно редактирует файл) в sed

Вот sed, который будет соответствовать пробелу или номеру и заменять их запятой, используя команду или символ OR | сбежал как \| ниже:

sed 's/ [0-9]\|[0-9] /,/g'

Итак, вам нужно заменить первые два и последний пробел в каждой строке запятой. Вы не можете просто заменить каждый пробел, потому что 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

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

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