我有一个只有1列的CSV文件,但有近1500条记录。
我想从每条记录中提取信息,例如,
“样品电池的电压:11.1V,容量:4500mAh”
我想提取11.1并放在另一个文件中,即在“电压:”之后,在“V”之前。如果记录没有“电压:”,我想在其中有一个空行。
我在Linux环境中,最简单的方法是什么?
答案 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
如果我误解了不含电压线的格式,可以调整哪些。请注意,我的表达式在格式化方面非常脆弱,可以进行改进。另请注意,我没有包含引文,因为您的意图不明确。需要(通过)调整上述内容以便与之合作。