繁体   English   中英

如何从从 CSV 文件检索的数据中删除列中的逗号

[英]how do I remove commas within columns from data retrieved from a CSV file

我有几个 CSV 文件需要处理。 在每个列中,字段中可能有逗号。 字符串也可能位于双引号内。 我想出一些东西是正确的,但我正在处理有时在 200 - 400 MB 之间的 CSV 文件。 用我当前的代码处理它们可以让一个 11MB 的文件需要 4 分钟来处理。

我可以在这里做些什么来让它运行得更快,或者一次处理整个数据而不是逐个字段地运行代码?

import csv

def rem_lrspaces(data):
    data = data.lstrip()
    data = data.rstrip()
    data = data.strip()
    return data

def strip_bs(data):
    data = data.replace(",", " ")
    return data 

def rem_comma(tmp1,tmp2):

    with open(tmp2, "w") as f:
        f.write("")
        f.close()  

    file=open(tmp1, "r")
    reader = csv.reader(file,quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True)
    for line in reader:

        for field in line:
            if "," in field : 
                field=rem_lrspaces(strip_bs(field))

            with open(tmp2, "a") as myfile:

                myfile.write(field+",")

        with open(tmp2, "a") as myfile:
            myfile.write("\n")                    

pdfsource=r"C:\automation\cutoff\test2"
csvsource=pdfsource

ofn = "T3296N17"

file_in = r"C:\automation\cutoff\test2"+chr(92)+ofn+".CSV"
file_out = r"C:\automation\cutoff\test2"+chr(92)+ofn+".TSV"   

rem_comma(file_in,file_out)

一些低垂的果实:

  1. strip_bs太简单了,无法证明调用该函数的开销是合理的。
  2. rem_lrspaces冗余地剥离空白; 您只需要一次调用data.strip() ,在这种情况下,证明单独的函数也太简单了。
  3. 您还需要花费大量时间反复打开输出文件。

此外,最好将已经打开的文件句柄传递给rem_comma ,因为它允许将内存中的类文件对象作为参数传递,从而使测试更容易。

此代码只是从每一行构建一个新的字段列表,然后使用csv.writer将新字段写回输出文件。

import csv

def rem_comma(f_in, f_out):
        reader = csv.reader(f_in, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True)
        writer = csv.writer(f_out)

        for line in reader:
            new_line = [field.replace(",", " ").strip() for field in line]
            writer.write_row(new_line)   

ofn = "T3296N17"

file_in = r"C:\automation\cutoff\test2"+chr(92)+ofn+".CSV"
file_out = r"C:\automation\cutoff\test2"+chr(92)+ofn+".TSV"   

with open(file_in) as f1, open(file_out) as f2:
    rem_comma(f1, f2)    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM