代码之家  ›  专栏  ›  技术社区  ›  dassouki

向后分析csv文件

  •  3
  • dassouki  · 技术社区  · 15 年前

    我有以下格式的csv文件:

    CSV FILE
    "a"             , "b"     , "c" , "d"
    hello, world    , 1       , 2   , 3
    1,2,3,4,5,6,7   , 2       , 456 , 87
    h,1231232,3     , 3       , 45  , 44
    

    问题是第一个字段中有逗号“”。我无法控制文件的生成,因为这是我接收它们的格式。有没有办法从行尾到行首向后读取csv文件?

    我不介意编写一个小的python脚本来实现这一点,如果我被引导到正确的方向。

    8 回复  |  直到 15 年前
        1
  •  16
  •   Eli Courtwright    15 年前

    这个 rsplit string方法拆分从右开始而不是从左开始的字符串,因此它可能是您要查找的(它需要一个参数来指定要拆分的最大次数):

    line = "hello, world    , 1       , 2   , 3"
    parts = line.rsplit(",", 3)
    print parts  # prints ['hello, world    ', ' 1       ', ' 2   ', ' 3']
    

    如果您想从已拆分列表中每个项目的开始和结束处删除空白,那么只需使用 strip 列表理解方法

    parts = [s.strip() for s in parts]
    print parts  # prints ['hello, world', '1', '2', '3']
    
        2
  •  4
  •   Greg    15 年前

    我不完全理解为什么你想把每一行都倒过来读,但你可以这样做:

    import csv
    file = open("mycsvfile.csv")
    reversedLines = [line[::-1] for line in file]
    file.close()
    reader = csv.reader(reversedLines)
    for backwardRow in reader:
        lastField = backwardRow[0][::-1]
        secondField = backwardRow[1][::-1]
    
        3
  •  1
  •   Kevin LaBranche    15 年前

    先反转字符串,然后处理它。

    TMP=TMP [::- 1 ]

        4
  •  1
  •   mkolodziejski    15 年前

    从您提供的示例来看,“列”的大小是固定的。第一个(带逗号的)是16个字符长,那么为什么不试着逐行读取文件,然后每行读取前16个字符(作为第一列的值),其余的相应地读取?在得到每个值之后,您可以进一步分析它(修剪空白,等等…)。

        5
  •  1
  •   Lazarus    15 年前

    那不是一个csv文件,逗号分隔就意味着这一点。

    你怎么能确定这不是:

    CSV FILE
    "a"             , "b"     , "c" , "d"
    hello           , world   , 1   , 2   , 3
    1               , 2       , 3   , 4   , 5,6,7,2,456,87
    h               , 1231232 , 3   , 3   , 45,44
    

    如果文件如您所示,那么第一个组应该用引号括起来,看起来字段名很奇怪,包含逗号的字段不应该是。

    我不喜欢从源代码处修复错误,如果他们声称这是正确的csv,我会推回到数据生成器来提供正确的csv。

        6
  •  1
  •   cyberconte    15 年前

    您总是可以使用regex做一些事情,比如(perl regex)

    #!/usr/bin/perl
    
    use IO::File;
    
    if (my $file = new IO::File("test.csv"))
    {
        foreach my $line (<$file>) {
        $line =~ m/^(.*),(.*?),(.*?),(.*?)$/;
        print "[$1][$2][$3][$4]\n";
        }
    } else {
        print "Unable to open test.csv\n";
    }
    

    (第一个是贪婪的搜索,最后三个不是) 编辑 :已发布完整代码,而不仅仅是regex

        7
  •  0
  •   Toon Krijthe    15 年前

    如果总是期望相同的列数,并且只有第一列可以包含逗号,那么只需读取任何内容并在开始处连接多余的列。

    问题是接口不明确,您可以尝试绕过这一点,但更好的解决方案是尝试修复接口(这通常比创建几个补丁更困难…)。

        8
  •  0
  •   Tim    15 年前

    我同意比尔先生的看法。这是一个格式错误的csv文件。最好的办法是找到其他分隔符,或者停止重载逗号,或者引用/转义非字段分隔逗号。