0

我正在尝试解析 CSV,如果任一列都满足条件,则将其写入新的 csv。

例如

如果我有一个看起来像的 csv

123 Some Street
Flat 1, 21 Other road
House, Someother street

我需要分析每一行,所以如果一个数字出现在第一列而不是第二列,那么我需要提取该数字,如果两列中都有一个数字,那么我需要提取两者,如果没有数字,那么我需要提取第一列中的文本。然后用 2 个原始列和 3 个新列写一个新的 csv,数字 1,数字 2,文本。即单位号码,门牌号码,房屋名称。所以新的 CSV 看起来像

123 Some Street, , 123, 
Flat 1, 21 Other road, 1, 21,
House, Someother street, , , House.

任何指导都会非常有帮助。

谢谢

已编辑

import csv

csvFile = 'myData.csv'
csvOut = 'myOut.csv'

reader = csv.reader(csvFile)
writer = csv.writer(csvOut)

for row in reader:
    num = \d | \d\d | \d\d\d
     if row [0] || row [1] == num
        if row [1] == num
            writer.row [3]
        else row [0] == num
            writer.row [2]
            writer.row [3]
    else writer.row [0] [2]

csvOut.close()

再次编辑

我希望这可能是一个更清晰的解释:

我希望输出是一个新的 CSV,其中原始数据位于 [0]、[1] 行中,然后如果行中只有一个数字,即写入行 [3] 的门牌号,如果有是一行中的 2 个数字(行 [0] 和行 [1]),那么它们应该分别写入行 [2] 和 [3],如果没有数字,则将行 [0] 中的字符串写入行 [ 4]。最终我需要将公寓号、门牌号和门牌名称分成 3 个不同的列。

进一步编辑

我一直在编写代码,现在有以下内容,我觉得我越来越近了,但还有一段路要走?

import csv
import re

csvFile = open(myData.csv, 'rb')
csvOut = open(myOut.csv, 'wb')

reader = csv.reader(csvFile)
writer = csv.writer(csvOut)

for row in reader:
    a = row [0] re.compile('\d' | '\d\d' | '\d\d\d')
    a1 = row [0] re.compile('\d' | '\d\d' | '\d\d\d')
    b = row [1] 
    b1 = row [1] re.compile('\d' | '\d\d' | '\d\d\d')
        if b = re.compile('\d' | '\d\d' | '\d\d\d')
            writer.writerow(a,b,a1,b1, )
        elif a = re.compile('\d' | '\d\d' | '\d\d\d')
            witer.writerow(a,b, , b1, )
        else
            writer.writerow(a,b, , ,a)

csvOut.close()

谢谢

4

2 回答 2

0

这可能会提供线索,因为我不完全确定您需要什么。

$cat t1

123 Some Street
Flat 1, 21 Other road
House, 23 Someother street

例子

import csv
import re
p = re.compile('\d+')
for row in csv.reader(open('t1')):
    print "ROW", row
    match = p.search(row[0])
    if match:
        print "\t#1", match.group()
    if len(row) > 1:
        match = p.search(row[1])
        if match:
            print "\t#2", match.group()

输出

ROW ['123 Some Street']
    #1 123
ROW ['Flat 1', ' 21 Other road']
    #1 1
    #2 21
ROW ['House', ' 23 Someother street']
    #2 23
于 2013-02-13T22:55:59.877 回答
0

以下代码可以完成您需要的一切。对于输出,只需索引元组并写出您想要的组件。每个结果有 6 个元素

#(flat str, flat #, street str, street #, street, street type)

a = """
123 Some Street
Flat 1, 21 Other road
House, Someother street
"""

import re
#flat gets a word, 0 or more spaces, 0 or more digits
flat    = "([a-z]+ *(\d+)*)"
#street gets 0 or more digits, 1 or more spaces, 1 or more words with a space consuming until it hits street, or road or drive
street  = "((\d+)* +([a-z]+ )+?(street|road|drive))"
address = "%s*.*?%s" % (flat,street)
m       = re.compile(r"%s" % address, re.I)
results = m.findall(a)
with('output.csv','w') as fout:
    #whatever you wish to name your columns
    fout.write("Building,Address,Suite Number, Building Number")
    for r in results:
        fout.write("%s,%s,%s,%s" % (r[0],r[2],r[1],r[3]))

结果

[('', '', '123 Some Street', '123', 'Some ', 'Street'),
 ('Flat 1', '1', '21 Other road', '21', 'Other ', 'road'),
 ('House', '', ' Someother street', '', 'Someother ', 'street')]
于 2013-02-14T05:49:39.273 回答