0

我有一个文件(非常大),其中包含行,每行都有一些用逗号分隔的字段。

从这个文件中,我必须提取几个字段并将它们转储到一个新行中。但这里的复杂之处在于,最后一个字段(列)本身包含一个逗号,但该特定字段由双引号“some,thing”(比如说)标识。

让我举个例子:-

the, quick, brown, fox, jumps, right, over, the little, "lazy,dog"

这个文件中有很多这样的行,用逗号分隔。

最后一列中可能有很多逗号,

现在我需要从中提取几列,最后一列肯定是我想要提取的。

我想过使用 awk,但似乎 awk 对分隔符的拆分没有限制。

python 有一个 split() 函数,我们可以在其中限制编号。分割数,字符串的最后一个索引。['the', 'quick', 'brown', 'fox', 'jumps', 'right', 'over', 'the little', 'lazy,dog']。

此外,应从最终输出中删除双引号。

我试图使用 awk,因为 awk 在处理大文件时对我来说似乎更快。但是是否有可能实现这种事情,或者我需要使用 Pythonic 的循环和拆分方式,这似乎有点慢。

注:1)编号。列数是固定的。

请建议。

4

4 回答 4

3

这不会让您远离 Python,但这似乎是一种csv情况,尤其是当您提到要删除最后一项周围的引号时。

测试.csv:

ay,bee,cee,dee,"ee,eff"
foo,bar,"baz,quux"

测试.py:

#!/usr/bin/env python

import csv

fp = open('test.csv', 'r')
for row in csv.reader(fp):
    print row
fp.close()

输出:

['ay', 'bee', 'cee', 'dee', 'ee,eff']
['foo', 'bar', 'baz,quux']
于 2012-04-18T16:07:36.240 回答
2

使用 python 的csv模块。

with open('myfile.txt') as data:
    for line in csv.reader(data):
        print line[2], line[5]

它将无缝地为您处理报价。

于 2012-04-18T16:07:08.937 回答
0

Python 对我来说似乎是一个更好的选择。

csv 模块对此非常有用,我使用它来解析 csv 文件并将每一行插入数据库中,使用这种开销,可以快速处理数十万行,并且如前所述,它会自动处理引号。

如果您更喜欢 split 方法,那么:

>>> string = 'the, quick, brown, fox, jumps, right, over, the little, "lazy,dog"'
>>> string = string.replace('"','').split(', ') # note the ', ' not ','
>>> print string
['the', 'quick', 'brown', 'fox', 'jumps', 'right', 'over', 'the little', 'lazy,dog']

将保持您的最后一个字段完好无损。

使用 awk:

$ cat tmp
the, quick, brown, fox, jumps, right, over, the little, "lazy,dog"
$ cat tmp | awk 'BEGIN { FS = ", " } ; { print $9 }'
"lazy,dog"

为您提供您的字段,但不会删除引号,因此您必须将其传递给 sed 或其他东西。还要再次注意 FS 是 "," 不是 ","

$ cat tmp | awk 'BEGIN { FS = ", " } ; { print $9 }' | sed 's/"//g'
lazy,dog

然后,当然,你仍然必须对数据做任何你想做的事情,即使其中一个 cl 程序更快地完成特定任务,我发现将它全部保存在 python 中会导致整体更快的过程和更少的头痛。

于 2012-04-18T16:43:56.077 回答
0

是的,那里看起来像一个 csv 文件;)

这是一个sed替代方案

sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g'

这将为您提供新行中的每个令牌,然后您可以选择您想要的令牌

$ echo 'the, quick, brown, fox, jumps, right, over, the little, "lazy,foo , bar, fpp,dog"' | sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g'

the
quick
brown
fox
jumps
right
over
the little
lazy,foo , bar, fpp,dog

注意第一行是空的

获取第一个、第四个和最后一个字段

$ echo 'the, quick, brown, fox, jumps, right, over, the little, "lazy,foo , bar, fpp,dog"' | sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g' | sed -n '2p;5p;$p'
the
fox
lazy,foo , bar, fpp,dog

将所有内容放在一起(并使用bash

while read -r; do
    sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g' <<< "$REPLY" | sed -n '2p;5p;$p'
done < file
于 2012-04-18T16:11:04.063 回答