2014-11-03 29 views
0

我想将一打100MB + csv文件分割成一个卷曲文章的可管理较小文件。分裂一个CSV文件,并保持头文件没有中间文件

我已经设法做到了,但有很多临时文件和IO。它正在永恒。

我希望有人能让我更有效地做到这一点;最好用几乎没有磁盘IO #!/ bin/sh的

for csv in $(ls *.csv); do 
    tail -n +2 $csv | split -a 5 -l - $RANDOM.split. 
done 

# chose a file randomly to fetch the header from 

header=$(ls *.csv |sort -R |tail -1 | cut -d',' -f1) 

mkdir split 

for x in $(/usr/bin/find . -maxdepth 1 -type f -name '*.split.*'); do 
    echo Processing $x 
    cat header $x >> split/$x 
    rm -f $x 
done 

上述脚本可能无法完全正常工作。我基本上通过这些命令的组合来工作。

我决定在上传失败的情况下完全让curl POST成为另一个步骤;如果全部发布,我不想丢失数据。但是,如果说curl错误,数据可能会被放入重做文件夹中,那么这可以起作用。

#!/bin/sh 

# working on a progress indicator as a percentage. Never finished. 
count=$(ls -1 | wc -l 2> /dev/null | cut -d' ' -f1) 

for file in $(/usr/bin/find . -maxdepth 1 -type f); do 
    echo Processing $file 
    curl -XPOST --data-binary @$file -H "Content-Type: text/cms+csv" $1 
done 

编辑1 - 为什么随机的?因为当拆分下一个文件时,拆分将生成完全相同的文件,如同第一个文件所做的那样。所以... aa ab ac ...将针对每个文件生成。我需要确保通过拆分生成的每个文件在整个运行过程中都是唯一的

+0

您总是要让I/O从现有文件中编写新版本的文件。尽可能高效地完成这个过程应该是你的关注焦点。因为你的问题中有太多“其他”的东西。 (为什么$ RANDOM,这是您的解决方案的真正需求,还是您正在尝试,其他方面也不清楚)。可能包括输入文件结构的ascii艺术,然后是来自这些输入的预期输出文件。 (只是一个小样本集)。祝你好运。 – shellter 2014-11-03 05:14:29

+0

分割时总是会产生相同的文件。我需要随机确保每个文件分割都会产生独特的分割文件 – 2014-11-03 05:19:34

+0

对于我来说已经很迟了,我无法从您的口头描述中描绘出您想要做的事情,但我相信其他人很快就会用可行的解决方案来打好基础。祝你好运! – shellter 2014-11-03 05:21:27

回答

0

不太清楚您想完成什么,但在我看来,您正在逐行处理。因此,如果您序列化所有csv文件和行,则无需磁盘I/O即可完成。但是从您的描述中,我无法判断此脚本是运行多个实例还是只运行一个实例(多个进程或一个进程)。因此,我可以尽我所能模仿您的脚本以尽可能达到类似的结果,但要解决磁盘I/O问题。提供的代码下面,但如果有的话请纠正脚本错误,因为我没有办法运行/调试/验证:

for csv in $(ls *.csv | sort -R); do 
    # first read line skip the first line, since I see your tail -n +2 command. 
    (read line; 
    count=0; 
    while read line; do 
     Processing $line; 
     count=$(($count + 1)); 
     echo $csv.$count >> split/$count; 
    done 
    ) < $csv 
done 

你的“处理”的代码现在应该从一个详细的线过程,而不是一个文件。也许管,有你的Processing来处理STDIN将这样的伎俩:

echo $line | Processing 

你卷曲可以做类似的方式,从标准输入处理,与-更换@$file,并且可以打印你想要卷曲什么发送然后用管道将其卷曲,类似如下:

ProcessingAndPrint | curl -XPOST --data-binary - -H "Content-Type: text/cms+csv" $1 
+0

我不是看到$ csv被拆分的地方。 – 2014-11-04 22:35:13

+0

在你的分割中,你使用-1来为每个分割文件分割一行,即逐行分割。等价地,我使用while循环+读取+ I/O重定向,即“<”来逐行读取。这是一个即时阅读+处理。 – 2014-11-05 01:43:58

相关问题