【问题标题】:Convert multi line txt data to a CSV将多行文本数据转换为 CSV
【发布时间】:2021-12-23 05:04:45
【问题描述】:

我想知道是否有人可以为我指明正确的方向。

这是我的数据样本。

TRANS,"GUS000017787609","","","INSTL","","","","","","",,"","",20211025,
MTPNT,"",45654,"","","","","",,,
ASSET,"","INSTL","METER","","CR","G4SZV-2","FLN",2020,"XXXTYU422000","32","","LI"

我需要使用 python 以某种方式将此类信息转换为 CSV。我有数千行数据,每个 TRANS、MTPNT 和 ASSET 都被视为一个“行”。

有谁知道在此类数据上执行 ETL 的最佳技术类型是什么?

【问题讨论】:

  • 这已经是一个 CSV 文件了。将其转换为 CSV 是什么意思?
  • 也许 OP 想以编程方式将该 3 行模式合并到一个大文件的一行中,然后生成一个新的 CSV (AFAIU)
  • 您可以使用csv 库来读取和写入CSV 文件。您还可以使用 pandas.read_csv()pandas.to_csv() 在 CSV 和 Pandas 数据帧之间进行转换。
  • @flotingpurr 是的,就是这样!抱歉没有完全解释,我想改变 3 行模式中的数据并将数据转换为一行。

标签: python python-3.x csv


【解决方案1】:

您可以使用 grouper 配方一次读取 3 行 CSV 行并将它们组合起来。例如:

import csv
from itertools import zip_longest, chain

def grouper(iterable, n, fillvalue=None):
    "Collect data into non-overlapping fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)
    
    
with open('input.csv') as f_input, open('output.csv', 'w', newline='') as f_output:    
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)
    
    for triple_row in grouper(csv_input, 3, ''):
        row = list(chain.from_iterable(triple_row))
        #row[2] = 'test'      # modify 3rd value before writing  
        csv_output.writerow(row)

给你:

TRANS,GUS000017787609,,,INSTL,,,,,,,,,,20211025,,MTPNT,,45654,,,,,,,,,ASSET,,INSTL,METER,,CR,G4SZV-2,FLN,2020,XXXTYU422000,32,,LI

【讨论】:

  • 这听起来是个不错的起点!一旦它在一行上,我就可以开始为每个逗号分隔值添加列。
  • 我得到一些 'NoneType' 对象不可迭代?而且我不明白为什么,据我所知,我没有错误的数据
  • 如果您添加print(triple_row),您可能会发现它与您文件中的最后一个条目有关。如果没有确切的三行数,它将产生None。解决方案是在 grouper 调用中添加填充值。我已经更新了
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2019-05-08
  • 2013-04-04
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多