0

CSVを解析しようとしていますが、いずれかの列で基準が満たされている場合は、これを新しいcsvに書き出します。

例えば

次のようなcsvがある場合

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

各行を分析する必要があるので、2番目ではなく最初の列に番号が表示されている場合は、その番号を抽出する必要があります。両方の列に番号がある場合は、両方を抽出する必要があります。番号がない場合は、最初の列のテキストを抽出します。次に、2つの元の列と3つの新しい列番号1、番号2、テキストを使用して新しいcsvを記述します。つまり、フラット番号、家番号、家名。したがって、新しい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()

再編集

これがより明確な説明になることを願っています:

行[0]、[1]に元のデータが含まれる新しいCSVを出力し、行に番号が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 に答える