[英]splitting file into smaller files using by number of fields
我很難將較大的(50GB)csv文件分解成較小的部分。 每行有數千個字段。 一些字段是用雙引號引起來的字符串,其他字段是整數,小數和布爾值。
我想逐行解析文件,然后按每行中的字段數進行拆分。 字符串可能包含幾個逗號(例如)以及許多空字段。
,, 1,30,50,“由父親,兒子和女兒以$ 4,000出售”,,,,, 12 ,,, 20.9,0,
我嘗試使用
perl -pe' s{("[^"]+")}{($x=$1)=~tr/,/|/;$x}ge ' file >> file2
將引號內的逗號更改為| 但這沒用。 我打算用
awk -F"|" conditional statement appending to new k_fld_files file2
請問有更簡單的方法嗎? 我正在查看python,但我可能需要一個實用程序來逐行流式處理文件。
使用Python-如果您只想解析包含嵌入式定界符的CSV並使用新的定界符進行流式處理,則應執行以下操作:
import csv
import sys
with open('filename.csv') as fin:
csvout = csv.writer(sys.stdout, delimiter='|')
for row in csv.reader(fin):
csvout.writerow(row)
否則,使它能夠做各種事情並不難。
每列輸出到文件的示例(未測試):
cols_to_output = {}
for row in csv.reader(fin):
for colno, col in enumerate(row):
output_to = cols_to_output.setdefault(colno, open('column_output.{}'.format(colno), 'wb')
csv.writer(output_to).writerow(row)
for fileno in cols_to_output.itervalues():
fileno.close()
這是awk
替代方案。
假設帶引號的字符串格式正確,即始終使用開頭和結尾的引號,並且其他引號內沒有引號,則可以通過在其他每個字段上執行gsub
來建議您進行替換,
用|
代替|
。
帶管道
以下是使用coreutils
cut
抓取第3至coreutils
和14-15列時可能如何執行的示例:
awk -F'"' -v OFS='' '
NF > 1 {
for(i=2; i<=NF; i+=2) {
gsub(",", "|", $i);
$i = FS $i FS; # reinsert the quotes
}
print
}'\
| cut -d , -f 3-6,11,14-15 \
| awk -F'"' -v OFS='' -e '
NF > 1 {
for(i=2; i<=NF; i+=2) {
gsub("\\|", ",", $i)
$i = FS $i FS; # reinsert the quotes
}
print
}'
請注意,還有一個附加的后處理步驟可以還原|
對,
。
完全在awk中
或者,您可以在范圍指定方面失去一些通用性,而在awk
完成整個操作。 在這里,我們僅獲取第3至6列:
extract.awk
BEGIN {
OFS = ""
start = 3
end = 6
}
{
for(i=2; i<=NF; i+=2) {
gsub(",", "|", $i)
$i = FS $i FS
}
split($0, record, ",")
for(i=start; i<=end-1; i++) {
gsub("\\|", ",", record[i])
printf("%s,", record[i])
}
gsub("\\|", ",", record[end])
printf("%s\n", record[end])
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.