2012-06-01 84 views
1

对不起,如果这是一个初学者的问题,但我没有太多的python经验,并真的可以用一些帮助来弄清楚这一点。如果有更好的编程语言来解决这个问题,我会更愿意听到它使用Python解析和重新格式化CSV /文本数据

我正在一个小项目,我有两个数据块,格式不同。它们都是以CSV文件格式保存的电子表格,我真的希望使一个组与另一组匹配,而无需手动编辑所有数据。

我需要做的就是去通过CSV,和格式保存的任何像这样的数据:

10W

20E

15-16N

17-18S

以这样的格式(分别对应的行格式):

10,W

20,E

,, 15,16,N

,, 17,18,S

让他们只能在电子表格打开时复制。

我可以将文件转换为pyth中的字符串,但我不确定如何正确编写某些内容以搜索数字连字符数字格式。

我会非常感谢任何帮助,我可以得到。由于

回答

1

这听起来像是正则表达式的一个很好的用例。一旦你将线条拆分成单独的字符串并剥离空白(使用s.strip()),这些应该可以工作(我假设这些是主要方向;如果假设不正确,则需要将[NESW]更改为其他内容):

>>> import re 
>>> re.findall('\A(\d+)([NESW])', '16N') 
[('16', 'N')] 
>>> re.findall('\A(\d+)([NESW])', '15-16N') 
[] 
>>> re.findall('\A(\d+)-(\d+)([NESW])', '15-16N') 
[('15', '16', 'N')] 
>>> re.findall('\A(\d+)-(\d+)([NESW])', '16N') 
[] 

第一正则表达式'\A(\d+)([NESW])'仅与数字后跟大写字母N,E,S或W的第二只匹配的字符串,与随后的数字序列开始的序列开头的字符串匹配由一个连字符,后跟另一个数字序列,后跟一个大写字母N,E,S或W.强制它在开始时匹配,以确保这些正则表达式不匹配较长字符串的后缀。

然后,你可以做这样的事情:

>>> vals = re.findall('\A(\d+)([NESW])', '16N')[0] 
>>> ','.join(vals) 
'16,N' 
>>> vals = re.findall('(\d+)-(\d+)([NESW])', '15-16N')[0] 
>>> ',,' + ','.join(vals) 
',,15,16,N' 
+0

哇,谢谢你的快速反应。我仍然试图绕过它,但我想我已经明白了。我假设一旦我将CSV分解为字符串并可以通过第二位代码运行这些代码,我可以将每行代码写入一个新的CSV文件中?我对这个还很新,我只是想确保我把所有东西都正确地放下,哈哈。再次感谢您的帮助。 – UpstairsDownstairs

+0

@UpstairsDownstairs,是的,这听起来像它会工作。另外,虽然我认为我在这里陈述的方法已经足够,但您可以使用Python的内置['csv'](http://docs.python.org/library/csv.html)模块。如果您的文件格式比您给出的示例文本更为复杂,'csv'将帮助您更快地获取简化的字符串。 – senderle

+0

谢谢!我正在玩csv模块,所以一旦我明白了,我会在这里使用它。这太好了,再次感谢您帮助我。本周末我可能需要花几个小时的时间来搞清楚一切,但这非常有帮助。对此,我真的非常感激。 – UpstairsDownstairs

0

在你的情况,我认为快速的解决方案将涉及regexps

您可以使用match方法提取的不同的令牌时,他们匹配给定的正则表达式,或者split方法的字符串分割成令牌给出了分隔符。

但是,在您的情况下,分隔符将是单个字符,因此您可以使用str类中的split方法。

1

这是使用regexs的整体解决方案。 @senderle击败了我的答案,所以请随时剔除他的回复。这只是在这里添加的,因为我知道在我的代码中首先将我的头围绕re是多么困难。

import re 

dash = re.compile('(\d{2})-(\d{2})([WENS])') 
no_dash = re.compile('(\d{2})([WENS])') 

raw = '''10W 
20E 
15-16N 
17-18S''' 
lines = raw.split('\n') 

data = [] 

for l in lines: 
    if '-' in l: 
     match = re.search(dash, l).groups() 
     data.append(',,%s,%s,%s' % (match[0], match[1], match[2])) 
    else: 
     match = re.search(no_dash, l).groups() 
     data.append('%s,%s' % (match[0], match[1])) 

print '\n'.join(data) 
相关问题