我有一个包含1000行代码的CSV:
server1.com, rec2, rec3, rec4, rec5, rec6, OK
server2.com, rec2, rec3, rec4, rec5, rec6, FAULT
server3.com, rec2, rec3, rec4, rec5, rec6, OK
某些字段确实包含逗号,并且这些字段用双引号分隔。
如果该记录的第7个字段的值为OK,我将如何从每个记录中提取第一个字段。因此,在上面的示例中,我最终会得到一个包含
的文件server1.com
server3.com
我已经成功地解决了这个问题:
import csv
with open('file.csv', 'rb') as csvfile:
linereader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in linereader:
if row[6] == "OK":
print row[0]
感谢所有的建议。
答案 0 :(得分:1)
如果最后一列是“OK”,则打印1st col:
awk -F, '$NF=="OK"{print $1}' file
如果第7列是“OK”,则打印第1列:
awk -F, '$7=="OK"{print $1}' file
答案 1 :(得分:1)
在Python中:
csv = open(file_path, 'r')
outfile= open(output_path, 'w')
line = csv.readline()
while not len(line) == 0:
vals = line.split(', ')
if vals[6] == "OK":
outfile.write(vals[0] + "\n")
line = csv.readline()
csv.close()
outfile.close()
答案 2 :(得分:1)
尝试使用grep和sed:
grep "OK$" yourfile | sed 's/,.*//'
server1.com
server3.com
或者awk:
awk -F, '/OK$/{print $1}' yourfile
server1.com
server3.com
或纯粹的sed:
sed -n '/OK$/{
s/,.*//
p
}' yourfile
答案 3 :(得分:1)
Perl选项:
perl -F, -lanE 'say $F[0] if /OK$/' inFile
答案 4 :(得分:1)
使用Text::CSV的Perl解决方案,适用于包含逗号的字段,只要它们按RFC 4180 * 引用:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Text::CSV;
my $csv = Text::CSV->new({
binary => 1,
auto_diag => 1,
allow_whitespace => 1
}) or die "Cannot use CSV: " . Text::CSV->error_diag();
open my $fh, '<', 'file.csv' or die $!;
while (my $row = $csv->getline($fh)) {
say $row->[0] if $row->[6] eq 'OK';
}
close $fh;
server1.com
server3.com
*实际上,Text::CSV可以处理引用和转义超出RFC 4180指定范围的各种方法。使用quote_char
,allow_loose_quotes
,escape_char
和{{1 } {} allow_loose_escapes
的选项,用于指定确切的行为。