我有一个文本文件要解析并输出到csv。数据来自SSURGO土壤元数据(USDA)。我已将描述数据库表,列名和描述的pdf转换为文本文件,并希望转换为csv。
列值为:
Table Physical Name:
Table Label:
Column Physical name:
Column Label:
Desc:
有时,Column物理名称和列标签不包含说明。示例输入文件是:
Table Physical Name: chaashto
Table Label: Horizon AASHTO
Column Physical Name: aashtocl
Column Label: AASHTO
desc: Some description here.
并非每个列名称和标签都有相应的desc:或表物理名称和标签。
我使用以下代码解析数据,使每个列物理名称和标签都有一行:
count = 0
cnt = 0
out = open("output_test.txt", "wb")
value1,value2,value3,value4,value5 = "","","","",""
for i,line in enumerate(lines):
key, value = line.strip().split(':',1)
if key == 'Table Physical Name':
value1 = value.strip()
if key == 'Table Label':
value2 = value.strip()
if key == 'Column Physical Name':
value3 = value.strip()
if key == 'Column Label':
value4 = value.strip()
if not lines[i+1].strip().startswith('desc'):
count = 1
if key == 'desc':
value5 = value.strip()
count = 1
if count == 1:
cnt += 1
record = value1 + ";" +value2 + ";" + value3 + ";" + value4 + ";" + value5 +";\n"
print cnt, record
out.write(record)
count = 0
value3 = " "
value4 = " "
value5 = " "
out.close()
(请原谅看起来很邋code的代码,只是学习Python)。
无论如何,问题在于,有时当输出一行时,它不包括列物理名称,并在该行的末尾插入\ r \ n。然后,后续行包括密钥"列物理名称:"列名称"
这是输出的外观:
chfrags;Horizon Fragments;chfragskey;Chorizon Fragments Key;A non-connotative string of characters used to uniquely identify a record in the Horizon Fragments table.;
这就是"坏"输出看起来:
coforprodo;Component Forest Productivity - Other; ;Low
Column Physical Name: fprod_r; ;
在上面的例子中," fprod_r"应该介于其他之间;和&#34 ;;低"和" \ r"之后;低不应该在那里。
令人抓狂的是,当我对输入文件进行子集化时,不再出现发生错误的位置。所以代码正确处理文本文件。
任何帮助都将不胜感激。
答案 0 :(得分:1)
无需手动执行所有 CSV ETL。 Python 有一个模块csv
,你可以利用它,它应该有助于消除你遇到的那种边缘情况。
您可以尝试这样的事情:
import csv
with open('foo.csv', 'wb') as f:
writer = csv.writer(f, delimiter=',',
quotechar='"', quoting=csv.QUOTE_ALL)
writer.writerow(('Table Physical Name', 'Table Label', 'Column Physical Name', 'Column Label', 'Desc'))
writer.writerow( ('chfrags', 'Horizon Fragments', 'chfragskey', 'Chorizon Fragments Key',
'A non-connotative string of characters used to uniquely identify a record in the Horizon Fragments table.')
)
哪个输出:
"Table Physical Name","Table Label","Column Physical Name","Column Label","Desc"
"chfrags","Horizon Fragments","chfragskey","Chorizon Fragments Key","A non-connotative string of characters used to uniquely identify a record in the Horizon Fragments table."
您可能需要稍微调整此代码以满足您的确切数据需求(即分隔符,引用类型以及行元组的确切详细信息),但这应该提供一般模板,使用您上面提到的数据,供您使用。
答案 1 :(得分:0)
全部,我道歉。有"隐形" \ r \ n当我使用记事本++时没有出现。不知道为什么,但是当我最终删除它们时,输出是正确的。不确定为什么\ r没有被转移到子集文件中。哦,好吧。