如何动态识别数据文件中的未知分隔符?

Gre*_*ier 14 python csv parsing textinput text-files

我有三个输入数据文件.每个都使用不同的分隔符来包含其中的数据.数据文件一个如下所示:

apples | bananas | oranges | grapes

数据文件二看起来像这样:

quarter, dime, nickel, penny

数据文件三看起来像这样:

horse cow pig chicken goat

(列数的变化也是有意的)

我的想法是计算非字母字符的数量,并假设最高计数是分隔符.但是,具有非空格分隔符的文件在分隔符之前和之后也有空格,因此空格会在所有三个文件上获胜.这是我的代码:

def count_chars(s):
    valid_seps=[' ','|',',',';','\t']
    cnt = {}
    for c in s:
        if c in valid_seps: cnt[c] = cnt.get(c,0) + 1
    return cnt

infile = 'pipe.txt' #or 'comma.txt' or 'space.txt'
records = open(infile,'r').read()
print count_chars(records)
Run Code Online (Sandbox Code Playgroud)

它将打印一个字典,其中包含所有可接受字符的计数.在每种情况下,空间总是获胜,所以我不能依靠它来告诉我分隔符是什么.

但我想不出更好的方法来做到这一点.

有什么建议?

eum*_*iro 75

如何尝试Python CSV的标准:http://docs.python.org/library/csv.html#csv.Sniffer

import csv

sniffer = csv.Sniffer()
dialect = sniffer.sniff('quarter, dime, nickel, penny')
print dialect.delimiter
# returns ','
Run Code Online (Sandbox Code Playgroud)

  • +1:肯定使用csv模块.解析分隔文件,特别是如果它们可能包含转义分隔符,引用字符串中的分隔符,引用字符串中的换行符等,则不是正则表达式的工作.一个正则表达式的解决方案迟早会失败,并且这些错误将是微妙的,并且令人头脑发麻. (5认同)
  • 这是一个很好的答案 - 但它不适用于OP的第一个例子.输入`apples | 香蕉| 橘子| 葡萄`声称分隔符是'''.如果从管道周围移除空格,它将按预期工作. (3认同)
  • 这是csv模块上一个有趣的函数,但是要小心,如果你有`;`作为分隔符(csv的另一个常见分隔符)并且在任何其他值上有逗号,则Sniffer将返回`,`作为分隔器.示例`sniffer.sniff('quarter,cent; dime; nickel; penny').delimiter`将返回`,` (3认同)
  • 但如果您对分隔符的外观有所了解,可以设置具有优先权的分隔符:`sniffer.preferred = [';','|']` (2认同)

Jos*_*shD 5

如果您使用的是 python,我建议只在所有有效的预期分隔符的行上调用re.split

>>> l = "big long list of space separated words"
>>> re.split(r'[ ,|;"]+', l)
['big', 'long', 'list', 'of', 'space', 'separated', 'words']
Run Code Online (Sandbox Code Playgroud)

唯一的问题是其中一个文件是否使用分隔符作为数据的一部分。

如果您必须确定分隔符,最好的办法是计算除空格之外的所有内容。如果几乎没有出现,那么它可能是空格,否则,它是映射字符的最大值。

不幸的是,真的没有办法确定。您可能有用逗号填充的空格分隔数据,或者您可能有 | 用分号填充的分隔数据。它可能并不总是有效。