【问题标题】:Clean data with unwanted quotes使用不需要的引号清理数据
【发布时间】:2017-08-12 23:05:28
【问题描述】:

我有一个 csv 文件,其中包含客户编号、地址和保费。它是从另一个系统导出的,因此字段带有引号。在 R 中导入时,由于字符串中包含不需要的引号和逗号,我遇到了一个问题。查看示例(客户端 1 和 2 正确,客户端 3 有问题)

Client number Address                               Premium
"1"            "Building5, Street 30,NY"              1000
"2"           "Building7, Street 10,NY"               1000
"3"           "Building 7\", Street 10,NY"            1000

因此,R 将其读取为我不想要的新的第 4 列。我如何以编程方式摆脱它。我可以使用基于 R 或 Python 的解决方案来清理 csv 。如果纠正问题很困难,即使删除客户端 3 也是可以接受的解决方案

尝试在 python 中这样做,但没有帮助

import csv

def remove_special_prob(s):
return ''.join(c for c in s if c not in ('\"'))


with open("Client.csv","rb") as infile, open("Client_new.csv","wb") as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile, quoting=csv.QUOTE_ALL)
for line in reader:
    writer.writerow([remove_special_prob(elem) for elem in line])

【问题讨论】:

  • \"中的反斜杠存在于文件中,还是R打印的内容?您可以从记事本、vi、emacs 或其他外部文本编辑器进行复制和粘贴吗?
  • 在原始csv文件中
  • 哦,更新了我的答案。
  • 您是否尝试过pandas 来读取 CSV?他们的read_csv method 非常好。什么是分隔符?是制表符还是空格

标签: python r


【解决方案1】:

如果它在实际的 csv 中,则使用 return s.replace('\"', '')

您的代码不起作用,因为您正在迭代每个字母,然后将其比较两个字母,即 \" 在一起。基本上,您的c 在迭代过程中将首先变为\,然后变为",但永远不会等于\"

编辑

用于替换 -

def remove_special_prob(s):
    return s.replace('\"', '')

用于跳过特殊问题行

with open("Client.csv","rb") as infile, open("Client_new.csv","wb") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile, quoting=csv.QUOTE_ALL)
    for line in reader:
         if line.count('"') > 6:
             continue
         writer.writerow(line)

【讨论】:

  • 似乎没有解决问题。有几行是非常麻烦的。有没有办法做到这一点 - 我知道列数 (3) 。因此,有效记录中的预期报价数量应为 6。如何从 csv 中删除所有包含 >6 个引号 (") 的行?
  • line.count('"') > 6 时使用continue 跳过行。
  • with open("Client.csv","rb") as infile, open("Client_new.csv","wb") as outfile: filtered_csv = (line for line in infile if not line.count('"') > 42) reader = csv.reader(filtered_csv) writer = csv.writer(outfile, quoting=csv.QUOTE_ALL) for line in reader: writer.writerow() 尝试过,但似乎确实有效(对不起,python 初学者)
  • 更新了我的答案,请检查。
【解决方案2】:

在 Python 中,您可以使用 pandasread_csv,它非常通用

import pandas as pd
from io import StringIO

text = StringIO("""Client number\tAddress\tPremium
"1"\t"Building5, Street 30,NY"\t1000
"2"\t"Building7, Street 10,NY"\t1000
"3"\t"Building 7\", Street 10,NY"\t1000""")

df = pd.read_csv(text, sep='\t')
df['Address'] = df['Address'].str.replace('"', '')
# df.to_clipboard()

结果

    Client number   Address Premium
0   1   Building5, Street 30,NY 1000
1   2   Building7, Street 10,NY 1000
2   3   Building 7, Street 10,NY    1000

【讨论】:

  • 挑战是我需要将此 csv 导入 R 以运行一些预先编写的代码。如果我导入熊猫,我将不得不写回 csv 并导入回 R 。现在我的地址字段已经有多个逗号(有效)。由于这些逗号,再次导出到 csv 会搞砸
  • 你可以让 python 将其导出为 csv 并以; 为分隔符
【解决方案3】:

在R中,可以使用readLines读取文件,去掉字符串\",转换成数据框:

txt <- readLines("client.csv")
df <- read.csv(text=gsub('\\\\\"', "", txt))

【讨论】:

  • 试过 readlines 但第二步需要大量时间 我的代码是 read.table(textConnection(txt))
  • 与直接读取文件所花费的时间相同。如果您想更快地替代read.csv,请提出另一个问题。
猜你喜欢
  • 2022-01-09
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多