我正在尝试解析以下文件(从我当地银行导出的交易):
Clnr Kontonr Konto Valuta Bokföringsdatum Transaktionsdatum Referens Kontohändelse Belopp
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 Hyresgästför Autogiro -15,00
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 SPOTIFY SPOTIFY Kortköp/uttag -19,00
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 +46123456789 Swish mottagen 80,00
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 PRIS NYCKELKUND Debiteringsavgift -49,00
12345 1234567890 vardagskonto SEK 13-09-27 13-09-27 12345678 direktbetalning -301,00
12345 1234567890 vardagskonto SEK 13-09-27 13-09-27 Unionen Bg-bet. via internet -125,00
12345 1234567890 vardagskonto SEK 13-09-26 13-09-26 123456789012345 Överföring -1 000,00
但我似乎无法为它创建一个正确的正则表达式。目标是提取第5,6,7和9列(如果所有都可以提取它当然是奖励),但是第7列是非常棘手的,因为文件不是CSV而第7列可以包含多个单词。第8列是不可预测的,但我认为我在上面的例子中发现了大部分相关的可能性。
有关如何成功解析此文件的任何提示?显然我的正则表达还不够。 : - (
如果它有任何区别,我更喜欢它可以用Python解决,甚至可能用POSIX(grep / sed / etc)来解决。
答案 0 :(得分:1)
您可以使用re.split
分隔值。例如:
import re
raw_data = open("test.csv").readlines()
header = raw_data[0]
data = raw_data[1:]
for line in data:
values = re.split("\s{2,}", line.strip()) # splits by two or more spaces
print list(values) # show as a list
答案 1 :(得分:1)
只是为了它,这就是你可以“自动地”解析这种格式的方法:
import re
# find out spaces' positions common to all rows
spaces = sorted(set.intersection(*[
set(m.end() for m in re.finditer(ur'\s', line))
for line in data
]))
# split by these positions
for line in data:
row = []
p = 0
for s in spaces:
row.append(line[p:s])
p = s
row.append(line[p:])
row = filter(len, map(unicode.strip, row))
print ' | '.join(row) # or whatever you want...
对于您的数据:
data = u"""
Clnr Kontonr Konto Valuta Bokföringsdatum Transaktionsdatum Referens Kontohändelse Belopp
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 Hyresgästför Autogiro -15,00
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 SPOTIFY SPOTIFY Kortköp/uttag -19,00
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 +46123456789 Swish mottagen 80,00
12345 1234567890 vardagskonto SEK 13-09-30 13-09-30 PRIS NYCKELKUND Debiteringsavgift -49,00
12345 1234567890 vardagskonto SEK 13-09-27 13-09-27 12345678 direktbetalning -301,00
12345 1234567890 vardagskonto SEK 13-09-27 13-09-27 Unionen Bg-bet. via internet -125,00
12345 1234567890 vardagskonto SEK 13-09-26 13-09-26 123456789012345 Överföring -1 000,00
""".strip().splitlines()
打印:
Clnr | Kontonr | Konto | Valuta | Bokföringsdatum | Transaktionsdatum | Referens | Kontohändelse | Belopp
12345 | 1234567890 | vardagskonto | SEK | 13-09-30 | 13-09-30 | Hyresgästför | Autogiro | -15,00
12345 | 1234567890 | vardagskonto | SEK | 13-09-30 | 13-09-30 | SPOTIFY SPOTIFY | Kortköp/uttag | -19,00
12345 | 1234567890 | vardagskonto | SEK | 13-09-30 | 13-09-30 | +46123456789 | Swish mottagen | 80,00
12345 | 1234567890 | vardagskonto | SEK | 13-09-30 | 13-09-30 | PRIS NYCKELKUND | Debiteringsavgift | -49,00
12345 | 1234567890 | vardagskonto | SEK | 13-09-27 | 13-09-27 | 12345678 | direktbetalning | -301,00
12345 | 1234567890 | vardagskonto | SEK | 13-09-27 | 13-09-27 | Unionen | Bg-bet. via internet | -125,00
12345 | 1234567890 | vardagskonto | SEK | 13-09-26 | 13-09-26 | 123456789012345 | Överföring | -1 000,00
答案 2 :(得分:-1)
为什么不是这个正则表达式:
(.*?)( +|\r\n|\n|$)
似乎所有列都用2个空格分隔