Есть ли набор простых сценариев для работы с CSV-файлами, доступными где-нибудь? - PullRequest
2 голосов
/ 03 декабря 2011

Я ищу несколько скриптов, которые позволили бы манипулировать общими CSV-файлами ...

обычно что-то вроде:

  1. add-row FILENAME INSERT_ROW
  2. get-row FILENAME GREP_ROW
  3. заменить строку FILENAME GREP_ROW INSERT_ROW
  4. Удалить строку FILENAME GREP_ROW

, где

  • FILENAME имя файла csv с первой строкой, содержащей заголовки, "" используемой для разделения строк, которые могут содержать ','
  • GREP_ROW строка пар field1 = value1 [, fieldN = valueN, ...], используемая для идентификации строки на основе значений ее полей в CSV-файле
  • INSERT_ROW строка пар field1 = value1 [, fieldN = valueN, ...], используемая для замены (или добавления) полей строки.

возможно в python, используя пакет csv ... Идеально используя Python, чтобы связать каждое поле как переменную и разрешить более продвинутые правила GREP, такие как fieldN> XYZ ...

Ответы [ 4 ]

4 голосов
/ 03 декабря 2011

В Perl существует традиция редактирования на месте, основанная на философии Unix.

Мы могли бы, например, написать простую команду add-row-by-num.pl следующим образом:

#!/usr/bin/perl -pi
BEGIN { $ln=shift; $line=shift; }
print "$line\n" if $ln==$.;
close ARGV if eof; 

Замените третью строку на $_="$line\n" if $ln==$.;, чтобы заменить строки.Исключите $line=shift; и замените третью строку на $_ = "" if $ln==$.;, чтобы удалить строки.

Мы могли бы написать простую команду add-row-by-regex.pl следующим образом:

#!/usr/bin/perl -pi
BEGIN { $regex=shift; $line=shift; }
print "$line\n" if /$regex/;

Или просто команда perl perl -pi -e 'print "LINE\n" if /REGEX/'; FILES.Опять же, мы можем заменить print $line на $_="$line\n" или $_ = "" для замены или удаления соответственно.

Нам больше не нужна строка close ARGV if eof;, потому что нам не нужен счетчик $.после обработки каждого файла.

Есть ли какая-то причина, по которой обычной утилиты unix grep не хватает?Вспомните, регулярное выражение (PATERN){n} соответствует PATERN ровно n раз, т. Е. (\s*\S+\s*,){6}{\s*777\s*,) требует 777 в 7-м столбце.

Существует даже регулярное выражение perl для преобразования ваших пар fieldN=value в этот регулярныйвыражение, хотя я бы сам использовал split, map и join.

Кстати, File :: Inplace обеспечивает редактирование на месте для файловых дескрипторов.

4 голосов
/ 03 декабря 2011

Perl имеет драйвер DBD :: CSV , который позволяет получить доступ к файлу CSV, как если бы это была база данных SQL.Я играл с ним раньше, но не использовал его широко, поэтому я не могу дать подробный обзор этого.Если ваши потребности достаточно просты, это может сработать для вас.

0 голосов
/ 04 декабря 2011

Приложение :: CCSV делает кое-что из этого.

0 голосов
/ 03 декабря 2011

Обычный способ в Python - использовать csv.reader для загрузки данных в список кортежей, затем выполнить операции добавления / замены / получения / удаления для этого собственного объекта Python, а затемиспользуйте csv.writer , чтобы вывести файл обратно.

Операции с файлами CSV на месте в любом случае не имеют большого смысла.Поскольку записи обычно не имеют фиксированной длины, не существует простого способа вставить, удалить или изменить запись, не перемещая одновременно все другие записи.

Как говорится, Python fileinputмодуль имеет режим обновления файлов на месте.

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