Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用按字段数将文件拆分为较小的文件_Python_Unix_Csv_Sed_Awk - Fatal编程技术网

Python 使用按字段数将文件拆分为较小的文件

Python 使用按字段数将文件拆分为较小的文件,python,unix,csv,sed,awk,Python,Unix,Csv,Sed,Awk,我很难将一个大的(50GB)csv文件分解成更小的部分。每行有几千个字段。一些字段是双引号中的字符串,其他字段是整数、小数和布尔值 我想逐行解析文件,并按每行中的字段数进行拆分。字符串可能包含几个逗号(如),以及许多空字段 父亲、儿子和女儿以4000美元的价格出售 我试着用 perl -pe' s{("[^"]+")}{($x=$1)=~tr/,/|/;$x}ge ' file >> file2 将引号中的逗号改为|,但这不起作用。我计划使用 awk -F"|" condit

我很难将一个大的(50GB)csv文件分解成更小的部分。每行有几千个字段。一些字段是双引号中的字符串,其他字段是整数、小数和布尔值

我想逐行解析文件,并按每行中的字段数进行拆分。字符串可能包含几个逗号(如),以及许多空字段

父亲、儿子和女儿以4000美元的价格出售

我试着用

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)
否则,让它做各种各样的事情就不难了

每列输出到文件的示例(未测试):


这里有一个
awk
备选方案

假设带引号的字符串格式良好,即始终有起始引号和终止引号,并且在其他引号中没有引号,您可以通过在每个其他字段上执行
gsub
来执行建议的替换,将
替换为

带有管道

下面是使用
coreutils
cut
抓取第3列到第6列、第11列和第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
    }'

那么,一列就是一个文件吗?这是一行的一部分。有几百万行。最好使用数据中未包含的字段分隔符重新导出文件。“|”char通常是安全的,并且是可见的,不像另一个常用的标签char。祝你好运。请使用“rb”模式,否则多行字段可能无法在Python2.x上工作
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
    }'