-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 文件,我将第二列的内容替换为字符串“input”。但是,我需要先从该列内容中获取一些信息。

内容可能如下所示:

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

如您所见,它具有奇怪的数据类型,尤其是它在行尾有 2 个双引号,而不是您期望的只有一个。

在替换列值之前,我需要提取XCORDandYCORD信息,例如XCORD = 2and 。YCORD = 42然后我想插入一个额外的列,名为X_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”时才有效。如果有时格式略有不同,则需要调整正则表达式以允许这样做。如果发生这种情况,我添加了断言以提供更有用的错误消息。

您提到希望将列命名为 X_Y。您的脚本似乎假设没有标题,而我的修改版本肯定做出了这个假设。同样,如果有标题行,您需要对此进行调整。

而且,是的,我同意其他评论者的观点,即使用 csv 模块通常会更干净,用于读取和写入 csv 文件。

于 2013-03-12T09:15:05.440 回答