【问题标题】:Delete whitespace characters in quoted columns in tab-separated file?删除制表符分隔文件中引用列中的空格字符?
【发布时间】:2013-12-08 16:50:48
【问题描述】:

我有一个类似的文本文件并得到了很大的帮助来解决它,但我必须意识到我对一般编程和正则表达式太陌生,无法修改下面由 steveha 编写的伟大 Python 脚本Similar file

编辑:我想去掉制表符、换行符和其他字符,而不是“普通”单词、数字、感叹号、问号、点 - 为了得到一个干净的 CSV 并从那里做文本分析。

重新进口 导入系统 _, infile, outfile = sys.argv s_pat_row = r''' "([^"]+)" # 匹配列;这是第 1 组 \s*,\s* # 匹配分隔逗号和任何可选空格 (\S+) # 匹配列;这是第 2 组 \s*,\s* # 匹配分隔逗号和任何可选空格 "((?:\\"|[^"])*)" # 匹配可以包含转义引号的字符串数据 ''' pat_row = re.compile(s_pat_row, re.MULTILINE|re.VERBOSE) s_pat_clean = r'''[\x01-\x1f\x7f]''' pat_clean = re.compile(s_pat_clean) row_template = '"{}",{},"{}"\n' 使用 open(infile, "rt") 作为 inf,open(outfile, "wt") 作为 outf: 数据 = inf.read() 对于 re.finditer(pat_row, data) 中的 m: 行 = m.groups() 清理 = re.sub(pat_clean, ' ', row[2]) 单词 = clean.split() 清理 = ' '.join(words) outrow = row_template.format(row[0], row[1], 清理) outf.write(outrow)

我不知道如何修改它以匹配此文件,其中有 \t 分隔列和文本,而不是第二列中的数字。我的目标是为内容分析准备好清理过的文本,但我似乎需要多年的学习才能达到我熟悉的程度...... ;-)

谁能帮我修改它,使其适用于下面的数据文件?

“from_user” “to_user” “full_text” "_____erik_" "systersandra gigatarmadillo kuttersmycket NULL NULL" "\"men du ...? är du bi?\". \"näeh. Tyvärr\"#fikarum,Alla vi barn i Bullerbyn 去#swecrime。#fjällbackamorden,Ny mobil och en väckare som ringer 0540.#fail,När jag måste välja,\"äta kakan eller ha den kvar\", så carpe diar jag kakan på sekunden. #mums,Låter RT @bobhansson:Om pessimisterna 杠杆 7 år kortare är det ju inte alls konstigt att dom är det。 http://t.co/a1t5ht4l2h,Finskjortan på tork:检查! Dags att leta fram gå-bort skorna..."

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    如果您的 CSV 文件使用制表符而不是逗号作为分隔符,那么在 s_pat_row 中,您应该将 , 字符替换为 \t。此外,示例文本文件中的第二个字段包含空格,因此s_pat_row 中的(\S+) 模式将不匹配它。你可以试试这个:

    s_pat_row = r'''
        "([^"]+)"          # match column; this is group 1
        \s*\t\s*           # match separating tab and any optional white space
        ([^\t]+)           # match a string of non-tab chars; this is group 2
        \s*\t\s*           # match separating tab and any optional white space
        "((?:\\"|[^"])*)"  # match string data that can include escaped quotes
    '''
    

    这可能足以解决您当前的问题。

    【讨论】:

    • 当我运行你的 s_pat_row 时,我最终得到一个只包含第一行的文件:“from_user”“to_user”“full_text”。那对你有用吗?我也会尝试更改您的脚本部分...
    • 我不确定我是否理解您的示例数据文件。这真的应该是嵌入换行符的单行吗?
    • 是的,空行上有一个\n,“tork!”之间有一个\t和“检查!”在最后一行。
    • 我明白了,这比我意识到的要棘手。当“字段”包含换行符时,使用 csv 模块对您没有帮助。我认为最直接的问题是文件的第二个字段包含空格,因此 (\S+) 将不匹配它。我已经用一种似乎对您的示例文本有用的模式更新了答案,至少可以解析 CSV 字段。
    • 奇怪,我一定是在混淆一些东西:现在只是以一个空文件结束。这是我现在运行的脚本:gist.github.com/mattiasostmar/7862242
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多