【问题标题】:str_replace_all() Won't Detect Return or New Line "\\r\\n"str_replace_all() 不会检测返回或换行“\\r\\n”
【发布时间】:2020-04-28 20:27:38
【问题描述】:

我正在使用 readLines() 在 R 上将 .csv 文件作为字符串加载。其中一列包含带有不需要的换行符的推文。

我需要删除换行符。在 Notepad++ 中,搜索:\r\n 和替换为%%% 有效,整个文件变成一行。

但是,在 R 中执行此操作时,str_replace_all()str_remove_all() 都不会检测到 \\r\\n,并且输出文件与输入文件相同。这是我的代码。我尝试了以下正则表达式:"\n"; "\r\n"; "\\n"; "\\r\\n";"\\r" 无济于事。

tx  <- readLines("line_breaks.csv", warn = FALSE)

tx <- str_replace_all(tx, "\\r\\n", "")

write_lines(tx, "C:/Users/u0126720/Documents/csv_test/one_line.csv")

我也试过了:

tx <- str_remove_all(tx, "\\r\\n")

输入文件如下所示:

date,tweet
Wed Jun 19 2019, Como pretendia ser un angel , estando rodeada de demonios? ✨

Rp.????

hola, estas en la olla?"

所需的输出(以及我使用 Notepad++ 得到的结果):

Wed Jun 19 2019, Como pretendia ser un angel , estando rodeada de demonios? ✨Rp.????hola, estas en la olla?"

【问题讨论】:

  • 您的文件是否只有一条记录?如果你去掉所有的新线,你最终只会有一条大线。 readLines 的工作方式应该是一个没有任何换行符的字符值向量,这些值已被拆分为单独的值。也许paste(readLines("line_breaks.csv"), collapse="") 会有所帮助。否则,您如何区分“真正的”换行符和您想要摆脱的换行符?
  • 确实,问题出在我阅读文件的方式上。不,我有几千行这样的。谢谢!顺便说一句,我想支持您的解决方案,但它没有作为答案发布。

标签: r regex stringr


【解决方案1】:

我做了一个新的答案,因为我以前的答案没有回答正确的问题,但我留下了它,因为它可能对其他人有用。

如果您的文件是格式正确的 csv 文件,那么即使数据中包含 CRLF,您也应该能够以 csv 格式读取它。

tx  <- read.csv("line_breaks.csv", colClasses= stringsAsFactors = FALSE)

但是,从您的示例输入文件看来,csv 格式不正确(在第 2 行的第一个逗号之后缺少 "

编辑:在您的情况下发生的事情是 readLines 正在将 \r\n 读取为新行(应该如此),并且将以下文本放入向量的下一个条目中。所以\r\n不会出现在tx中。

编辑:您如何获取输入文件?如果您可以修复该方法以生成带有引号的正确 csv 文件,那么 R 会很高兴的。

【讨论】:

  • 数据是通过在线工具转换为 CSV 的 JSON 文件。 JSON 文件是使用 Twitter API 获得的。不对称的引号和意外的 CRLF 是推文或用户简历等内容的一部分。我使用 readLines 找到了解决此问题的方法,我将其作为替代答案发布。
【解决方案2】:

在我的情况下,我需要确保每条推文有一行,即我需要删除所有 CRLF,除了以第一列开头的行之前的那些,即日期。 我通过使用占位符 %%% 而不是 LFs 解决了这个问题,然后使用 gsub() 和正则表达式在日期列的每个单元格之前添加一个 LF:

tx <- paste(readLines("C:/Users/u0126720/Documents/csv_test/test.csv", encoding="UTF-8"), collapse="%%%")
tx <-gsub("(*UCP)(*UTF)%%%([S|M|T|W|F]{1}[u|o|e|h|r|a]{1}[n|e|d|u|i|t]{1} [J|F|M|A|S|O|N|D]{1}[a|e|p|u|c|o]{1}[n|b|r|y|l|g|p|t|v|c]{1})", "\n\\1", tx, ignore.case = FALSE, perl=TRUE, fixed=FALSE)

这会导致以下结果:

date, tweet
Wed Jun 19 2019, Como pretendia ser un angel , estando rodeada de demonios? ✨Rp.?hola, estas en la olla?"
Wed Jun 19 2019, RT @ignacioschmied: Mi hermano @maitan_69 está realizando

等等

【讨论】:

    【解决方案3】:

    您必须使用四个反斜杠来匹配 R 正则表达式中的斜杠。这是因为在正则表达式中,反斜杠用于控制字符和一些通配符,而在 R 中,反斜杠也用于控制字符。因此,如果您将"\\r" 放入 R 中,正则表达式会将其视为\r,然后尝试匹配 CR。试试:

    tx <- str_replace_all(tx, "\\\\r\\\\n", "")
    

    【讨论】:

    • 如果输入中有文字 "\r\n" 值(带有斜杠),这将起作用。但在输入中似乎并非如此。只有实际的新行值。在这种情况下,您不需要转义任何斜线。这似乎根本不对。这很好用:stringr::str_replace_all("one\r\ntwo", "\r\n", "")
    • @missuse 添加斜线并不能解决问题。 @MrFlick 嗨,正如我在问题中所说,\r\n 不起作用。输出文件与输入文件相同。
    • 输入或"\r\n"1中是否有CR和LF?
    【解决方案4】:

    我可以使用 gsub("\n", "", tx, fixed=T),它是 R 基础。您可以调整它以删除两者或运行两次。

    【讨论】:

    • 这似乎也没有任何作用。输出文件看起来与输入文件相同,我仍然可以在 Notepad++ 上手动找到 \n 并替换为 "" 编辑:我读取文件的方式存在问题。见上文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2016-06-23
    • 2020-01-30
    • 2013-12-02
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多