【问题标题】:How to copy CSV file with 50000 rows and a header to another CSV,with some conditions?如何在某些条件下将具有 50000 行和标题的 CSV 文件复制到另一个 CSV?
【发布时间】:2018-05-21 17:55:35
【问题描述】:

我想将一个巨大的 csv 文件复制到另一个 csv 文件,但跳过开始 100 行的第一个文件和retainheader,同时我想忽略一些在引号中的名称之间不需要的逗号,例如-"嘿,罗杰”

输入数据:

    Header------>
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML
HYDROMORPHONE 2 MG TABLET,68084042301,0.08511,03/23/2016,EA
"BICILLIN L-A 2,400,000 UNITS",60793070210,54.03213,01/01/2016,ML
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML

在第五行中,“BICILLIN L-A 2,400,000 UNITS”是一个元素,中间包含逗号,我想忽略或替换为空格,也想忽略前 3 行。所以 output.csv 看起来像:

Header------>
    HYDROMORPHONE 2 MG TABLET,68084042301,0.08511,03/23/2016,EA
    "BICILLIN L-A 2 400 000 UNITS",60793070210,54.03213,01/01/2016,ML
    EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML

请帮助我。 下面是我的sn-p:

       with open(filename , 'rb') as infile:
            data_in = infile.readlines()

        with open ('temp.csv', 'wb') as outfile:
            outfile.writelines(data_in[0])
            outfile.writelines(data_in[3:])
        os.remove(filename)    
        os.rename('temp.csv',filename)

我没有办法替换其中不需要的逗号。

【问题讨论】:

  • 我不是 python 大师,但我使用过 CSV 文件(很遗憾)。包含逗号的指标是字段周围的双引号。如果您想删除那些“额外”逗号,请专注于匹配包含在引号中的字段的正则表达式,然后从中删除逗号,然后使用该字符串(不带引号是我的建议)。至于保留标题并删除某些行,我会使用迭代器来跳过一组行,进行记录处理然后附加到目标文件。祝你好运。
  • 你写过: 1) 从第一个文件和retainheader开始跳过100行 ; 2) 想忽略前 3 行。那么,您的实际具体情况是什么?
  • 您必须在 data_in 上逐行循环,并按照您希望使用 if 语句等的方式跳过/更正代码。然后,如果您将更正的行放入一个列表并将其写在最后,或者在处理它们时逐行写。
  • 您可以将this answer 和this answer 结合到您之前的问题中并获得所需的解决方案,还是您要逐步重复您的问题,直到 SO 社区为您完成所有工作?

标签: python python-3.x python-2.7 csv


【解决方案1】:

您将需要逐行访问文件,因为您有一个有趣的要求,即保留第一行(标题)但随后有一个间隙,并在各个行上执行一些正则表达式工作。您的代码应如下所示:

import os
filename = "name_of_file.csv"
with open(filename , 'rb') as infile:
  with open ('temp.csv', 'wb') as outfile:
    start_row = 3;
    row_count = 0;
    for line in infile.readlines():
      if row_count >= start_row:
        # find all matches for commas inside double quotes
        regex = b"\".*?,.*?\""
        matches = re.findall(regex, line)
        for match in matches:
          # for each match found, remove unwanted commas and replace them
          new_cell = match.replace(b',', b' ')
          line = re.sub(match, new_cell, line)
        # write line to file
        outfile.write(line)
      elif row_count == 0:
        # header row, copy it
        outfile.write(line)
      row_count += 1
os.remove(filename)    
os.rename('temp.csv',filename)

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2022-01-04
    • 2013-09-07
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多