是否有一组简单的脚本可以在某处操作csv文件?

时间:2011-12-03 02:51:32

标签: python perl csv

我正在寻找一些允许操作通用csv文件的脚本......

通常类似于:

  1. add-row FILENAME INSERT_ROW
  2. get-row FILENAME GREP_ROW
  3. 替换行FILENAME GREP_ROW INSERT_ROW
  4. 删除行FILENAME GREP_ROW
  5. 其中

    • FILENAME csv文件的名称,第一行包含标题,“”用于分隔可能包含','的字符串
    • GREP_ROW一对字符串field1 = value1 [,fieldN = valueN,...]用于根据csv文件中的字段值标识行
    • INSERT_ROW一对字符串field1 = value1 [,fieldN = valueN,...]用于替换(或添加)行的字段。

    最好在python中使用csv包... 理想情况下,利用python将每个字段作为变量关联,并允许更高级的GREP规则,如fieldN> XYZ ......

4 个答案:

答案 0 :(得分:4)

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*,)要求第7列中的777。

甚至有一个perl正则表达式可以将fieldN=value对转换为此正则表达式,尽管我自己使用splitmapjoin。< / p>

顺便说一下,File::Inplace为文件句柄提供了现场编辑。

答案 1 :(得分:4)

Perl具有DBD::CSV驱动程序,可以让您像访问SQL数据库一样访问CSV文件。我之前玩过它,但没有广泛使用它,所以我不能对它进行彻底的审查。如果您的需求足够简单,这可能适合您。

答案 2 :(得分:0)

Python中常用的方法是使用csv.reader将数据加载到元组列表中,然后对该本机python对象执行add / replace / get / delete操作,然后使用{{3将文件写回来。

无论如何,对CSV文件进行就地操作都没有多大意义。由于记录通常不是固定长度,因此没有简单的方法来插入,删除或修改记录,而无需同时移动所有其他记录。

话虽这么说,Python的csv.writer有一个就地文件更新模式。

答案 3 :(得分:0)

App::CCSV做了一些。