【问题标题】:Grep finds the string although the string is not visible in file尽管字符串在文件中不可见,但 Grep 找到了字符串
【发布时间】:2018-09-16 20:24:41
【问题描述】:

我从 1 天开始就遇到了一个奇怪的问题。我有一个 CSV 文件,我需要将其导入到我的配置单元表中。但是,CSV 文件在字符串之间嵌入了换行符。由于文件很大,我无法使用文本编辑器替换 '\n' 字符。

我编写了一个 python 程序来帮助我清理文件。 我从 CSV 文件中读取每一行,如果遇到任何换行符,我将其替换为空格。下面是我的程序。

# -*- coding: utf-8 -*-
import csv
import sys


file = open("team_contacts_cleaned.csv","w")
with open('team_contacts.csv') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
    stripped = [col.replace('\n', '') for col in row]
    file.write(','.join(stripped))
    file.write('\n')
file.close()
print 'Done'

一旦我有了这个清理过的文件,我就会看到行数符合预期。 当我在我知道打破记录的字符串上 grep 文件时,确切的行会打印在控制台中,但是,我在输出中看不到该行。

例如。

原始文件

cat team_contacts.csv | grep -A4 'Yennai Nambi'
,,,,,11/30/2017 11:45 AM UTC,,,,12/29/2017 11:51 AM UTC,,"Yennai Nambi Vandhavarai Yaemaatra Maattaen ;
Verum Yaeniyaay Naanirundhu Yaemaatra Maattaen ;
Naan Uyir Vaazhndhaal Ingaedhaan ;
Ooadivida Maattaen .",0,

清理文件

cat team_contacts_cleaned.csv | grep 'Naan Uyir Vaazhndhaal Ingaedhaan'
,,,,,11/30/2017 11:45 AM UTC,,,,12/29/2017 11:51 AM UTC,,Yennai Nambi Vandhavarai Yaemaatra MaOoadivida Maattaen .,0,

当我 cat 文件时,数据似乎被删除了,但是 grep 能够准确定位字符串,这意味着字符串仍然存在,但为什么没有显示出来?

现在,当我将这个清理过的文件移动到配置单元时,它再次中断,数据显示如下

Verum Yaeniyaay Naanirundhu Yaemaatra Maattaen ;    NULL    NULL    NULL    NULL    NULL    NULLNULL

Naan Uyir Vaazhndhaal Ingaedhaan ;  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULLNULL    

我在这里错过了什么?

我什至在编写 python 代码之前尝试了一个 gawk 程序,但我遇到了同样的问题。

gawk -v RS='"' 'NR % 2 == 0 { gsub(/\n/, "") } { printf("%s%s", $0, RT) }' team_contacts.csv > team.csv

【问题讨论】:

  • 这可能不是您的问题,但是……您使用 csv 读取输入 CSV 而不使用 csv 写入输出 CSV 是否有原因?
  • 同时,我很难理解您所描述的问题。如果您给我们一个minimal reproducible example,这将非常有帮助——带有示例输入、预期输出和实际输出——这样我们就可以自己重现并调试它。 (点击上面的链接到帮助页面;它有很多有用的信息。)
  • Python 无需将换行符更改为空格,只需执行tr '\n' ' ' < team_contacts.csv > team_contacts_cleaned.csv

标签: python shell csv hive grep


【解决方案1】:

我解决了这个问题。当我将文件分成几部分时,我收到了这个错误

_csv.Error:在未引用的字段中看到换行符

以下链接帮助我解决了这个问题。 https://stackoverflow.com/a/32827068/3538426

这可以关闭。更新了代码

import csv
import sys

csv.field_size_limit(sys.maxsize)

file = open("team_contacts_cleaned.csv","w")
with open('team_contacts.csv','rU') as csvfile:
    reader = csv.reader(csvfile)
    writer = csv.writer(file,quoting=csv.QUOTE_ALL)
    for row in reader:
        stripped = [col.replace('\n', ' ') for col in row]
        writer.writerow(stripped)
file.close()
print 'Done'

@agc 您的解决方案将不起作用,因为它将删除所有换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多