Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python解析和重新格式化CSV/文本数据_Python_Parsing_Text_Csv_Formatting - Fatal编程技术网

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

使用Python解析和重新格式化CSV/文本数据,python,parsing,text,csv,formatting,Python,Parsing,Text,Csv,Formatting,很抱歉,如果这是一个初学者的问题,但我没有太多的python经验,我真的需要一些帮助来解决这个问题。如果有更好的编程语言来解决这个问题,我会非常乐意听到 我在做一个小项目,我有两个数据块,格式不同。它们都是保存为CSV文件的电子表格,我真的很想让一个组与另一个组匹配,而不必手动编辑所有数据 我需要做的是通过CSV,并格式化保存的任何数据,如下所示: >>> vals = re.findall('\A(\d+)([NESW])', '16N')[0] >>> '

很抱歉,如果这是一个初学者的问题,但我没有太多的python经验,我真的需要一些帮助来解决这个问题。如果有更好的编程语言来解决这个问题,我会非常乐意听到

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

我需要做的是通过CSV,并格式化保存的任何数据,如下所示:

>>> 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'
10W

20E

15-16N

17-18秒

到如下格式(相应行到相应格式):

10,W

20,E

,15,16,N

,17,18,S

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

我能够用python将文件转换成字符串,但我不确定如何正确编写搜索数字-连字符-数字-字母格式的内容


如果能得到任何帮助,我将不胜感激。谢谢

在你的情况下,我认为快速解决方案包括

您可以使用该方法提取与给定正则表达式匹配的不同标记,也可以使用该方法将字符串拆分为给定分隔符的标记


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

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

第一个正则表达式“\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'

这是一个使用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)

哇,谢谢你的快速回复。我仍在想办法解决这个问题,但我想我已经有了主意。我假设一旦我把CSV分解成字符串,并可以通过你那里的第二位代码运行它们,我就可以让它将每一行写入一个新的CSV?我还是个新手,我只是想确保我把所有的东西都记好了,哈哈。再次感谢您的帮助。@楼上楼下,是的,听起来好像可以。另外,尽管我认为这里所述的方法已经足够了,但您可以使用Python的内置模块。如果您的文件格式比您给出的示例文本更复杂,
csv
将帮助您更快地获得简化字符串。谢谢!我在玩csv模块,所以一旦我弄明白了,我将在这里使用它。这太好了,再次感谢你帮我。这个周末我可能需要花上几个小时来弄清楚一切,但这非常有帮助。我真的很感激。