如果另一个字段具有特定值,如何从CSV中的每个记录中提取字段

时间:2014-02-14 16:27:24

标签: python perl sed

我有一个包含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]         

感谢所有的建议。

5 个答案:

答案 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_charallow_loose_quotesescape_char和{{1 } {} allow_loose_escapes的选项,用于指定确切的行为。