2009-08-13 62 views
3

我有以下格式的CSV文件:解析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脚本来这样做,如果我在正确的方向引导。

+2

也许他使它看起来像固定长度字段为清楚? 如果第一个字段包含分隔符,没有任何类型的引号字符是不是一个很好的格式化的CSV。 – davewasthere 2009-08-13 14:32:43

+1

这不是CSV。所以,你不能使用任何CSV解析技术。这是一些其他的格式,恰好有一些逗号,但绝对不是在任何意义上的单词的CSV。请停止将其称为CSV。称之为“类CSV”或“随机逗号值”。 – 2009-08-13 19:45:00

回答

15

rsplit字符串的方法从分割而不是左边的右边开始一个字符串,因此它可能是你在找什么(它需要一个参数指定次最大数量拆分):

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'] 
+1

是伟大的工作,感谢捆绑 – dassouki 2009-08-13 16:23:31

1

你总是可以做一些与正则表达式的,像(Perl的正则表达式)

#!/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"; 
} 

(第一个是贪婪搜索,最后3都没有) 编辑:发布完整的代码,而不是仅仅的正则表达式

+5

http://xkcd.com/208/ – 2009-08-13 14:32:25

1

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

TMP = TMP [:: - 1]

1

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

+0

我只是格式化它,为你的观赏乐趣 – dassouki 2009-08-13 14:35:28

1

那不是一个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。

+0

好一点,但我敢肯定,左右格式,因为我100%作为最后三列是int类型的。我们按原样收到文件。我们无法控制这一代。地狱,我什至不知道他们用什么来生成它们 – dassouki 2009-08-13 14:38:46

+0

我最喜欢的报价是“我爱IT标准......有这么多的选择!”缺少的是,即使在选择了众多标准中的一个之后,仍有一百万种方法可以把它搞砸。很高兴看到你找到了解决办法,我挺喜欢的正则表达式的解决方案太多,但它是昂贵的处理器,明智的(旧的Perl程序员情有独钟的正则表达式)。祝你好运! – Lazarus 2009-08-14 08:43:29

0

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

问题是界面不明确,你可以尝试绕过这个,但更好的解决方案是尝试修复界面(这通常比创建几个补丁更困难......)。

0

我同意先生啤酒。这是一个格式不正确的csv文件。最好的办法是寻找其他的分隔符或停止超载逗号或报价/逃避非现场逗号分隔

4

我不完全理解你为什么要读反向每一行,但你可以这样做:

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] 
+0

这很好:D谢谢 – dassouki 2009-08-13 16:24:03