从CSV文件中提取文本

时间:2009-05-11 14:19:34

标签: text csv

我有一个只有1列的CSV文件,但有近1500条记录。

我想从每条记录中提取信息,例如,

“样品电池的电压:11.1V,容量:4500mAh”

我想提取11.1并放在另一个文件中,即在“电压:”之后,在“V”之前。如果记录没有“电压:”,我想在其中有一个空行。

我在Linux环境中,最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

的Python

import csv
source = open( "myfile.csv", "rb" )
rdr= csv.reader( source )
for row in rdr:
    print "The sample battery has a Voltage: %.1fV, and capacity: %dmAh" % ( float(row[0]), int(row[1]), )

开始从CSV文件中提取数据。


显然(基于评论)文件看起来像这样。

"The sample battery has a Voltage: 11.1V, and capacity: 4500mAh"

可以是1列CSV。或者单行带奖金报价。我们假装它是一个1列的CSV。

import csv
import re
v_pat= re.compile(r' (\d+\.\d+)V' )
mah_pat = re.compile(r' (\d+)mAh' )
source = open( "myfile.csv", "rb" )
rdr= csv.reader( source )
for row in rdr:
   v_match= v_pat.search( row[0] )
   mah_match= mah_pat.search( row[0] )
   if v_match and mah_match:
       print v_match.group(1), mah_match.group(1)
   else:
       print # empty line -- not very informative

这样的事情可能是合适的。

答案 1 :(得分:2)

我不确定单列CSV文件的确切含义;如果它有一个列,是不是只是一个文本文件?

无论如何,如果每一行看起来像上面那样,我们有一个这样的文件:

bash-3.2$ cat example.txt
The sample battery has a Voltage: 11.1V, and capacity: 4500mAh
The sample battery has some other info but no v entry
The sample battery has a Voltage: 12.1V, and capacity: 4200mAh

然后你可以用正则表达式轻松地删除11.1并保留索引,如下所示:

bash-3.2$ sed -e 's/.*Voltage: \([^V]*\)V.*/\1/' -e 's/^The.*//' < example.txt
11.1

12.1

如果我误解了不含电压线的格式,可以调整哪些。请注意,我的表达式在格式化方面非常脆弱,可以进行改进。另请注意,我没有包含引文,因为您的意图不明确。需要(通过)调整上述内容以便与之合作。