簡體   English   中英

使用字段數將文件拆分為較小的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM