Потерял данные. Будущим читателям: сохраните данные на внешнем диске:)
Где-то у меня есть awk-скрипт, который работает со всем, что я когда-либо видел, когда Excel выводит :переменное число полей; запятые, новые строки и двойные -кавычки в полях; поля в кавычках даже там, где они не нужны; строка заголовка столбца; обрезать пустое пространство; Преобразование CRLF. Мне нужно найти его --Я думаю, что он конвертировался между несколькими форматами и занял около 300 строк (, включая собственную справочную страницу ). Также делает некоторую статистику по столбцам, чтобы помочь вам указать DDL.
Основная проблема заключается в том, чтобы решить, в каком формате вы хотите получить результат. Я остановился на "|" разделительные полосы для полей и $ для новых строк, чтобы избежать распространения одних и тех же проблем в выводе. Было бы легко использовать (, например )ASCII 0x1f (Разделитель единиц )для столбцов и 0x1D (Разделитель групп )для новой строки в поле -.
Я вижу ссылки на предыдущую тему, в которой упоминаются различные инструменты и библиотеки. Я написал это, когда застрял с заблокированной -неработающей критической системой --без загрузок. Мне даже не разрешили использовать C на случай, если я сломаю продукт их поставщика,но они признали: «Я мог бы писать сценарии --, вы не можете причинить им никакого вреда».
Входной файл a.csv:
1,1111,"111 W. Merchandise Mart's Plaza, Suite 1111",10101
2,2222,"222 Ben's St, Suite 222",20202
Один лайнер для парсинга входного файла с использованием Python 3:
$ cat a.csv|python -c $'import csv,sys;reader=csv.reader(sys.stdin);\nfor row in reader: print row'
Выход:
['1', '1111', "111 W. Merchandise Mart's Plaza, Suite 1111", '10101']
['2', '2222', "222 Ben's St, Suite 222", '20202']
Более сложный один вкладыш с выходом:
$ cat a.csv |python -c $'import csv,sys;reader=csv.reader(sys.stdin);\na=0\nb=0\nfor row in reader:\n\ta+=1\n\tprint "Column",a\n\tfor col in row:\n\t\tb+=1\n\t\tprint "\tColumn",b,":",col'
Column 1
Column 1 : 1
Column 2 : 1111
Column 3 : 111 W. Merchandise Mart's Plaza, Suite 1111
Column 4 : 10101
Column 2
Column 5 : 2
Column 6 : 2222
Column 7 : 222 Ben's St, Suite 222
Column 8 : 20202
Читаемая версия второго вкладыша:
import csv,sys;
reader=csv.reader(sys.stdin);
a=0
b=0
for row in reader:
a+=1
print "Column",a
for col in row:
b+=1
print " Column",b,":",col
Гну авк (гавк):
$ cat a.csv| awk -vFPAT='[^,]*|"[^"]*"' '{for (i=1; i<=NF; i++) {print ">"$i"<"}; print ""}'
>1<
>1111<
>"111 W. Merchandise Mart's Plaza, Suite 1111"<
>10101<
>2<
>2222<
>"222 Ben's St, Suite 222"<
>20202<
cvskit
это то, что вам нужно :он имеет надежный grep, cut, join,..., для файлов CSV. Я буду использовать только csvformat
.
В подобных ситуациях я предпочитаю:
(1 )преобразовать входные данные в «хороший» разделитель (ex :«,» в «§» )удаление ненужных кавычек
csvformat -d § input |...
(2 )обработать данные с "хорошим" разделителем
... | awk 'BEGIN{FS=OFS="§"}...' |...
(3 )снова преобразовать в CSV ("§" в "," )добавление кавычек при необходимости
csvformat -D § > final