Добавьте двойные кавычки в первую строку CSV-файла с помощью командной строки - PullRequest
1 голос
/ 18 мая 2019

У меня есть этот CSV-файл, и я заметил, что во время экспорта в него не была добавлена ​​начальная цитата. На самом деле в Ubuntu, если я наберу:

head -n 1 file.csv

Я получаю этот вывод:

801","40116","Hazelnut MT -L","Thursday Promo","Large","","5.9000","","801","1.0000","","3.6500","2.2500",".0000","default","","","","","Chatime","02/06/2014","09125a9cfffd4143a00e73e3b62f15f2","CB01","",".0000","5.9000","6.9000",".0000",".0000",".0000",".0000",".0000",".0000","0","","0","0","0","","","","","","","","","Modern Milk Tea","","","0","","","1","0","","","","","","","","0","Hau Chan","","","","","","","","","","0","","","","","","","-1","","","","","","","","","","","","0","00000000420714AA","2014-06-02","1900-01-01","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""

Есть ли какой-нибудь тип команды, который может помочь мне добавить пропущенную начальную кавычку?

1 Ответ

4 голосов
/ 18 мая 2019

Это должно работать в каждой оболочке posix:

printf \" | cat - file.csv > repaired-file.csv

Если вы довольны результатом, вы можете перезаписать оригинал

mv repaired-file.csv file.csv

Поскольку ваш файл имеет размер 70 ГБ, вы можетеЯ хочу избежать создания второго файла, однако это сложнее, чем кажется.Конечно, есть такие вещи, как опция sed inplace (-i) и утилита sponge из moreutils, но они не работают так, как вы могли бы ожидать.sed -i и sponge оба используют временные файлы или хранят весь файл в памяти (что больше не работает для 70 ГБ).Большое исследование истинного редактирования на месте можно найти в этом блоге .Вывод: нет стандартных инструментов, поддерживающих истинное редактирование на месте.Но следующие perl однострочные должны работать (уже адаптированы к вашим потребностям).

perl <<'EOF'
  use Tie::File;
  my @a;
  tie @a, 'Tie::File', 'path/to/your/file' or die 'Cannot tie file';
  $a[0] = '"' . $a[0];
EOF

Тесты

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

Входной файл 9,3 ГиБ f был создан с использованием seq 1000000000 > f.Перед синхронизацией одной команды я всегда заново генерировал f и очищал системный кеш, используя sync && echo 3 | sudo tee /proc/sys/vm/drop_caches.В моей системе было достаточно памяти для хранения всего файла, но я контролировал использование памяти вручную - все команды использовали только несколько КБ памяти.

  • printf \" | cat - f > f2; mv f2 f 1m 05s
  • perl … # script from above 1m 32s
  • sed -i '1s/^/"/' f 25m 57s (также все время использовал 100% CPU)

Я сам немного удивлен, что команда cat была быстрее, чемperl скрипт.Однако это имеет смысл, поскольку скрипт perl выполняет много операций поиска (можно увидеть, используя strace), тогда как cat просто копирует.

Резюме: Используйте cat команда, если у вас достаточно свободного места на диске.Если файл больше, чем оставшееся свободное дисковое пространство в вашей системе, используйте сценарий perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...