-1

これはPythonスクリプトです:

f = open('csvdata.csv','rb')
fo = open('out6.csv','wb')

for line in f:
    bits = line.split(',')
    bits[1] = '"input"'
    fo.write( ','.join(bits) )

f.close()
fo.close()

CSVファイルがあり、2番目の列の内容を文字列「input」に置き換えています。ただし、最初にその列の内容からいくつかの情報を取得する必要があります。

コンテンツは次のようになります。

failurelog_wl","inputfile/source/XXXXXXXX"; "**X_CORD2**"; "Invoice_2M";
"**Y_CORD42**"; "SIZE_ID37""  

ご覧のとおり、奇妙なタイプのデータがあります。特に、行の終わりに、予想される1つではなく、2つの二重引用符があります。

列の値を置き換える前に、andXCORDなどのYCORD情報を抽出する必要があります。次に、を表す、という名前の追加の列を挿入します。XCORD = 2YCORD = 42X_Y(2_42)

スクリプトを変更してそれを行うにはどうすればよいですか?

4

1 に答える 1

1

私があなたの質問を正しく理解しているなら、あなたはあなたが望む数を引き出すために単純な正規表現を使うことができます:

import re

f = open('csvdata.csv','rb')
fo = open('out6.csv','wb')

for line in f:
    bits = line.split(',')

    x_y_matches = re.match('.*X_CORD(\d+).*Y_CORD(\d+).*', bits[1])
    assert x_y_matches is not None, 'Line had unexpected format: {0}'.format(bits[1])
    x_y = '({0}_{1})'.format(x_y_matches.group(1), x_y_matches.group(2))

    bits[1] = '"input"'
    bits.append(x_y)

    fo.write( ','.join(bits) )

f.close()
fo.close()

これは、列2が常に数字の直前に「X_CORD」および「Y_CORD」と表示されている場合にのみ機能することに注意してください。わずかに異なる形式である場合は、それを可能にするために正規表現を調整する必要があります。それが発生した場合に、より有用なエラーメッセージを表示するためにassertを追加しました。

列にX_Yという名前を付けたいとおっしゃいました。あなたのスクリプトはヘッダーがないと仮定しているように見えます、そして私の修正されたバージョンは間違いなくこの仮定をします。繰り返しますが、ヘッダー行がある場合は、それを調整する必要があります。

そして、はい、私は他のコメント提供者に同意します。一般に、csvモジュールを使用するとcsvファイルの読み取りと書き込みがよりクリーンになります。

于 2013-03-12T09:15:05.440 に答える