【问题标题】:removing line breaks in a csv file删除 csv 文件中的换行符
【发布时间】:2017-03-08 04:59:13
【问题描述】:

我有一个带有行的 csv 文件,每行以 (@) 开头,一行中的所有字段都用 (;) 分隔。其中一个包含“文本”(“”[]“”)的字段有一些换行符,在将整个 csv 文件导入到 Excel 或访问时会产生错误。换行后的文本被认为是独立的行,不遵循表格的结构。

@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; ""[OJO!
la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras.
+info: co/plHcfSIfn8]""; 0
@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; ""[Porque nunca dejamos de amar]""; 0

使用 python 脚本对此有何帮助?或任何其他解决方案...

作为输出,我想要这些行:

@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; ""[OJO! la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras. +info: co/plHcfSIfn8]""; 0
@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; ""[Porque nunca dejamos de amar]""; 0

有什么帮助吗?我是一个 csv 文件(54MB),里面有很多带有换行符的行...其他一些行还可以...

【问题讨论】:

  • 还有,评论里面的@是不用考虑的吧?
  • 我想把所有的行都安排成例子的第二行 (@624914422...)
  • 你有没有尝试过?似乎有相当简单的方法开始。逐行阅读并丢弃@并按;拆分,否则使用csv模块。
  • 重复的双引号看起来完全是错误的。 CSV 的某些方言允许在带引号的字符串中使用换行符,但它们应该在每一侧用一个双引号字符包裹,而不是两个。

标签: python regex csv line-breaks


【解决方案1】:

您也应该分享您的预期输出。

无论如何,我建议您先清理文件以删除换行符。然后您可以将其读取为 csv。一种解决方案可以是(我相信有人会提出更好的建议:-))

清理文件(在 linux 上):

sed ':a;N;$!ba;s/\n/ /g' input_file | sed "s/ @/\n@/g" > output_file

以 csv 格式读取文件(您可以使用任何其他方法读取)

import pandas as pd
df = pd.read_csv('output_file', delimiter=';', header=None)
df.to_csv('your_csv_file_name', index=False)

让我们看看它是否对你有帮助:-)

【讨论】:

  • 谢谢@PaulRooney
【解决方案2】:

您可以搜索不以“@”开头的行,例如\r?\n+(?!@\d+;)

以下内容是从此 regex101 demo 生成的。它用空格替换这样的行结束。您可以将其更改为您喜欢的任何内容。

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\r?\n+(?!@\d+;)"

test_str = ("@4627289301; Lima, Peru; 490; 835551022915420161; Sat Feb 25 18:04:22 +0000 2017; \"\"[OJO!\n"
    "la premiacin de los #Oscar, nuestros amigos de @cinencuentro revisan las categoras.\n"
    "+info: co/plHcfSIfn8]\"\"; 0\n"
    "@624974422; None; 114; 835551038581137416; Sat Feb 25 18:04:26 +0000 2017; \"\"[Porque nunca dejamos de amar]\"\"; 0")

subst = " "

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

【讨论】:

  • 不行,demo在创建代码的时候在真实文本行加了一些字符...
  • @luisec 我不明白这是什么意思?如果它只是意味着它正在添加一个空格,那是因为subst = " ",您可以将其更改为“”,或者您可能想用任何替换它
  • 在文本“OJO!”之后的第一行演示用示例导出代码时添加“\n”(从演示中,我已经尝试过)...原行没有这些字符来识别换行符在哪里...
  • @luisec \n 仅表示字符串对象中的换行符。它仅存在于样本中。许多语言都支持这一点。如果您查看演示 @regex101.com/r/gEIbnS/3,您会看到示例文本没有文字 \n。这就是 regex101 生成示例代码的方式。
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 2013-09-08
  • 2022-01-27
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多