使用Python解析和重新格式化CSV /文本数据

时间:2012-06-01 19:45:18

标签: python parsing text csv formatting

抱歉,如果这是一个初学者的问题,但我没有太多的python经验,并且可以真正使用一些帮助来搞清楚这一点。如果有更好的编程语言来解决这个问题,我会非常乐意听到它

我正在开发一个小项目,我有两个数据块,格式不同。它们都是保存为CSV文件的电子表格,我真的想让一个组匹配另一个组而不必手动编辑所有数据。

我需要做的是浏览CSV,并格式化保存的所有数据:

  

10W

     

20E

     

15-16N

     

17-18S

使用这样的格式(相应格式的各行):

  

10,W

     

20,E

     

,, 15,16,N

     

,, 17,18,S

这样当它们作为电子表格打开时,它们就可以被复制了

我能够在python中将文件转换为字符串,但我不确定如何正确编写某些内容来搜索数字连字符数字格式。

我非常感谢能得到的任何帮助。感谢

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:1)

这是一个使用正则表达式的完整解决方案。 @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)

答案 2 :(得分:0)

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

您可以使用match方法在匹配给定正则表达式时提取不同的标记,或使用split方法将字符串拆分为给定分隔符的标记。

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