【问题标题】:How to convert a tab delimited .txt file to an xml or csv using Python如何使用 Python 将制表符分隔的 .txt 文件转换为 xml 或 csv
【发布时间】:2023-03-21 13:50:03
【问题描述】:

我有一个问题,在我们的应用程序中,在编写 python 脚本时,我们仅将文件数据用作字符串并仅作为字符串输出。然后我们用作文件的输出字符串,例如 xml 或 csv 下面是一个制表符分隔的 .txt 文件格式的例子,它将来自客户到我们的应用程序中。 H 是一个只会出现一次的标题,D 是可以重复的行级数据。 下面是关于这些字段是什么的规范。如何将此数据转换为 csv 格式或 xml 格式。我在 stackoverflow 上看到了很多示例,但都是关于打开文件并加载文件的。这在我的情况下不起作用。

H   CustID   CustPO   OrderDate   UserID   EmergencyFlag
D   <null>   PartNumber   Description   Quantity
D   <null>   PartNumber   Description   Quantity
D   <null>   PartNumber   Description   Quantity

预期输入:

H   1520982 wpg-A10026  2020-11-24  STG N
D       52892   LAMP RED OVAL STOP TAIL TURN    2   
D       AL919338    ECU MODULE 2S/1M M/H PLC SELECT 1

预期的 CSV 输出:

H,1520982,wpg-A10026,2020-11-24,STG,N
D,,52892,LAMP RED OVAL STOP TAIL TURN,2 
D,,AL919338,ECU MODULE 2S/1M M/H PLC SELECT,1

预期的 XML 输出:

<?xml version="1.0" encoding="utf-8"?>
<Record>
<Header>
<RecordType>H</RecordType>
<CustID>1520982</CustPO>
<CustPO>wpg-A10026</CustPO>
<OrderDate>2020-11-24</OrderDate>
<UserID>STG</UserID>
<EmergencyFlag>N</EmergencyFlag>
</Header>
<Details> 
<RecordType>D</RecordType>
 2nd field is null
<PartNumber>52892</PartNumber>
<Description>LAMP RED OVAL STOP TAIL TURN</Description>
<Quantity>2</Quantity>
</Details>
<Details> 
<RecordType>D</RecordType>
 2nd field is null
<PartNumber>AL919338</PartNumber>
<Description>ECU MODULE 2S/1M M/H PLC SELECT</Description>
<Quantity>1</Quantity>
</Details>
</Record>

我得到的输出但有些错误。如果您看到描述字段,它是一个完整的字段,但它被替换为逗号。但不是实际的制表位。 H 1520982 wpg-A10026 2020-11-24 STG N D 52892 LAMP,,RED,OVAL,STOP,TAIL,TURN 2
D AL919338 ECU,MODULE,2S/1M,M/H,PLC,SELECT 1.

所以我所做的我将您的代码更正为 content[i] = filter(bool, content[i].split("\t")) 所以它实际上可以在有制表符分隔的地方给出逗号。 现在它似乎有点工作,但我在 Details D 下的第二个字段为空,所以我想要它作为两个逗号,但这并没有出现任何提示? 非常感谢您的宝贵时间。赞赏

我得到的当前输出如下 在“D”之后仍然存在两个问题,需要检查一个空值是否确实需要出现在输出中。第二期描述字段已经有一个逗号,所以需要与客户确认他们是否可以停止在描述字段中发送逗号或其他字符。或者为了获得更好的准确性,我需要将其转换为 xml。 但是仍然非常感谢你这是很好的开始 H,1520982,wpg-A10026,2020-11-24,STG,N D,52892,LAMP, 红色椭圆形停止尾转,2, D,AL919338,ECU MODULE 2S/1M M/H PLC SELECT,1,

【问题讨论】:

标签: python


【解决方案1】:

通常,csv 模块应该可以。如果没有(您没有一致数量的空格分隔值,您可以手动拆分行:

content = "INPUTGOESHERE".split("\n")

for i in range(len(content)):
    content[i] = filter(bool, content[i].split(" ")) # split the lines at spaces and filter out empty strings

outstr = ""

for line in content:
    line = ",".join(line) # convert values list to a comma separated string for each line
    outstr += line + "\n"

print(outstr)

如何将 CSV 转换为 XML,请参阅 this answer 的编辑。

【讨论】:

  • 感谢您的回复。这仍然行不通。我收到错误作为 scripting.Traceback(最近一次调用最后):文件“脚本”,第 2 行内容 = inf.readlines() ^ IndentationError: expected an indented block
  • 很抱歉,我不是 python 程序员或专家,如果客户有不同的格式,它只是在我们用来转换文件的 erp 中。我们的标准格式是 xml 或 csv。
  • @ShashankMalali 请将我的代码复制粘贴到一个文件中,看看它是否运行(当然,您必须更改文件路径,但仅此而已)跨度>
  • @ShashankMalali 我的代码已正确识别,您在运行代码时一定犯了错误/错误。您是使用交互式解释器,还是将代码放在文件中?
  • 嗨,谢谢,这就是我所说的这段代码可能不起作用。因为我们不能使用“with open”,也不能从路径中选择文件。我们只是将 csv 文件中的整个数据作为字符串,输出也应该是一个字符串,无论是 csv 还是 xml。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2011-12-12
  • 2010-11-24
  • 1970-01-01
相关资源
最近更新 更多