在字段内使用逗号分析CSV文件

时间:2014-08-28 08:56:00

标签: python regex perl parsing module

我刚收到一位同事的文件,不知道如何解析这个:

输入:

key,value1,"value2,hello"

期望的输出:

key,value2

Perl或Python是我理解的语言。

谢谢,Bernardo

5 个答案:

答案 0 :(得分:3)

标准Perl模块Text::ParseWords可用于处理CSV文件。

#!/usr/bin/perl

use strict;
use warnings;

use Text::ParseWords;

while (<DATA>) {
  my @fields = parse_line(',', 0, $_);

  # Do something useful with the data in @fields
  print join ' | ', @fields;
}
__DATA__
key,value1,"value2,hello"

答案 1 :(得分:2)

这是valid CSV syntax,因此您只需使用CSV解析器。

您没有指定使用哪种语言,但大多数都在类库中可以使用CSV解析器(例如,.NET中的TextFieldParser)或作为外部组件(例如{{3在Apache Commons for Java中)。

如果你想要重新发明轮子(我不推荐),算法很简单:

result = "", inQuotes = false
read next character
if end-of-line:
    if inQuotes:
        throw error (unmatched quotes)
    yield result
    return
else if character = '"':
    invert inQuotes
else if character = ',' and not inQuotes:
    yield result
    result = ""
else:
    result += character

答案 2 :(得分:0)

使用正则表达式执行此操作的最佳方式:

[^,"]+|"(?:[^"]|"")+"

Regular expression visualization

Debuggex Demo

答案 3 :(得分:0)

如果要为此任务使用正则表达式,则以下内容应该有效:

(\S+,)\d+,\"(\d+),\S+\"

(\S+,)是第一个选择第一个键的捕获组,包括逗号。接下来是一些数字,一个逗号和一个引用\d+,\"。第二个捕获组(\d+)选择第二个值,后跟逗号,字符串和引号:,\D+\"

但正如其他人已经写过的那样,其他解决方案并不涉及正则表达式。

答案 4 :(得分:0)

(.*?)\,.*?\"(.*?)\,.*

你可以试试这个。

参见演示。

http://regex101.com/r/rI6jZ0/2