【问题标题】:Read_csv ignoring delimetersRead_csv 忽略分隔符
【发布时间】:2024-01-24 12:44:01
【问题描述】:

我在处理需要导入 R 的问卷时遇到问题。问题是以下条目包含逗号。

"Mozilla/5.0 (Windows NT 6.2; Win64;" x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36",Windows 8,Chrome 

当我指定逗号应该用作分隔符时,会拼接"KHTML, like Gecko""...36" ,Windows 8" 处的条目。但它不会以其他逗号分隔,例如"4,21 Jul 2020 - 16:06:04 CEST,21 Jul 2020 - 16:20:55 CEST,0h 14m 51s,"

我不明白为什么这些案件的处理方式不同以及如何解决问题。 任何帮助将不胜感激。

4,21 Jul 2020 - 16:06:04 CEST,21 Jul 2020 - 16:20:55 CEST,0h 14m 51s,0h 57m 2s,1595340364,1595341255,5,5,,Terminating,1,"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 ( like Gecko) Chrome/73.0.3683.75 Safari/537.36",Windows 8,Chrome 73.0.3683.75,1920,,DKJK1995,1,1,1,4,2,2,6,6,7,1,2,5,5,4,4,2,2,3,2,2,3,4,3,3,5,5,5,2,2,4,4,4,5,6,6,6,1,2,3,3,4,3,5,6,6,2,3,4,5,4,4,4,2,3,2,3,5,5,5,6,2,2,1,2,3,5,5,4,5,2,2,3,100,0,100,0,20,72,100,0,100,0,0,0,100,0,100,0,4,5,5,4,4,4,3,3,2,4,4,5,5,6,6,4,4,4,4,4,5,2,2,3,3,5,3,3,5,5,2,2,2,2,4,3,3,4,5,2,3,2,3,5,3,2,2,2,2,2,2,6,6,6,24,1,2,90,60,90,6,Deutschland,4,1,2,2,1,,1,1,"1,6,5,8,3,2,7,4","6,5,7,3,1,8,4,2","2,1","1,2,4,3",3,56,92,70,54,25,64,29,132,22,34,27,136,15,66,32,109,16,46,36,132,13,31,20,132,10,40,20,107,8,25,16,84,12,27,19,91,7,148,329,355,233,185,29,216,72,"4,2,6,7,5,1,8,3","2,3,1,7,4,8,6,5","5,6,7,1,3,8,4,2","8,3,11,13,10,2,16,5","7,4,11,13,9,2,16,6","7,4,11,13,9,2,16,6";

【问题讨论】:

  • 你能给我们举个例子来说明你想要的输出是什么吗?是否应该将提供的整个条目导入单个字符串?
  • 引号内的逗号被视为常规文本; KHTML 之后的那个不在引号内(因为该行的引号不匹配)。
  • 所以如果我理解正确,整个问题归结为:Win64;"
  • 是的,您可以使用readLines() 直接阅读它而不进行处理,删除错误的引用,然后在修复它之后再次阅读它。我会把细节放在答案中。

标签: r csv import


【解决方案1】:

问题是您显示的行的引号不匹配。从 cmets 看来,Win64;" 中的引用不应该结束该字段,而应该继续到 Safari/537.36"

解决此问题需要三个步骤:在不解释字段的情况下读取文件,清理错误字符串,然后将其作为 CSV 文件再次读取。例如,如果您的文件名为data.csv,您可以这样做:

lines <- readLines("data.csv")
cleaned <- sub('Win64;"', 'Win64;', lines)
data <- read.csv(textConnection(cleaned))

我不知道清理它的行是否能正常工作:您需要找出那些虚假引号的位置,并制定一个匹配和删除它们的模式。

【讨论】:

  • 感谢您给我解决问题的工具!我删除了似乎不在每一行中的 '"'... 我什至无法导入一个“已清理”的行。我将分隔符指定为 "," 但我只是一直被忽略。data &lt;- read.csv(textConnection(cleaned[1:2]),sep = ",",header = F,skip = 1) (this is supposed to ensure that i am running my trial with only one line.) data[1,1] %&gt;% writeClipboard() (If this matters this is how i extracted the one line)我编辑了我的帖子以显示一整行。请检查一下是否发现问题?谢谢!