我正在寻找一些允许操作通用csv文件的脚本......
通常类似于:
其中
最好在python中使用csv包... 理想情况下,利用python将每个字段作为变量关联,并允许更高级的GREP规则,如fieldN> XYZ ......
答案 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
对转换为此正则表达式,尽管我自己使用split
,map
和join
。< / 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做了一些。