将大文本文件拆分为列

时间:2012-02-06 00:08:07

标签: split

解决:我的一位好朋友为我写了以下程序:

filename="my_input_file"
context="channel"               # this is the key which separates the blocks in the input file
desired_column_separator=","    # this will separate the columns in the output file
output_prefix="modified_"       # prefix for the output file


if [ -d ./tmp ]
then

echo " "
echo "***WARNING***"
echo "I want to use and delete a ./tmp/ directory, but one already exists... please remove/rename it, or alter my code***"
echo " " 
exit
fi


mkdir ./tmp
cd ./tmp

csplit -z -n 4 ../$filename  /$context/ {*} 1> /dev/null

filenum=`ls -1 ./ | wc -l`
limit=`echo "$filenum - 1" | bc -l`
lines=`wc -l < xx0000`

touch tmp.dat


        for j in `seq 1 $lines`
        do

    oldstring=''

                for i in `seq 0 $limit`
                do

                inputNo=`printf "%04d" $i`
                string=`head -n $j 'xx'$inputNo | tail -n 1`

        oldstring=$oldstring$string$desired_column_separator

                done

        finalstring=`echo $oldstring | tr -d '\r' | tr -d '\n'`  

        echo "working on line "$j" out of "$lines
                echo -n $finalstring >> tmp.dat                
                echo -e "\r" >> tmp.dat

        done

mv tmp.dat ../$output_prefix$filename
cd ..
rm -r -f ./tmp/

echo "...done!"

原文:我知道在这个论坛上已经完成了拆分文本文件,但我找不到特定于我的问题的方法。 我想将一个大文件(> 200mb)拆分成文本行中的列,但是'split'函数将每个列放在它自己的文件中。说实话,3000多个单独的文件文本很难加载到其他程序中。除此之外,我还想提取文本文件的一部分作为我的数据的标题(第4行的最后一部分)。 初始文件由单个列组成,如下所示:

channel names:
03/02/2012 12:03:03 - TDS3k(CH1)
start times:
03/02/2012 12:08:02.311422
dt:
0.000000
data:
-8.000000E-4
-8.000000E-4
-1.600000E-3
... (9,994 lines omitted)
-2.400000E-3
-1.600000E-3
-2.400000E-3
channel names:
03/02/2012 12:03:03 - TDS3k(CH1)
start times:
03/02/2012 12:33:11.169533
dt:
0.000000
data:
-8.000000E-4
-1.600000E-3
-1.600000E-3
... (another 9,997 lines omitted)

我希望它看起来像这样:

channel names:                     channel names:
03/02/2012 12:03:03 - TDS3k(CH1)   03/02/2012 12:03:03 - TDS3k(CH1)
start times:                       start times:
03/02/2012 12:08:02.311422         03/02/2012 12:33:11.169533
dt:                                dt:
0.000000                           0.000000
data:                              data:
-8.000000E-4                       -8.000000E-4   ...
-8.000000E-4                       -1.600000E-3   ...
-1.600000E-3                       -1.600000E-3   ...
...                                ...

我怀疑在正确的地方进行分割比标题更容易,但我也不够好。

提前致谢

编辑:我还没有使用任何特定的语言。我只需要一种格式的数据,我可以在R中对其进行分析。我会选择你能提出的任何可行的方法。

1 个答案:

答案 0 :(得分:0)

您使用的是哪种语言?每个条目有多少“数据”条目?

使用python,最简单的方法是首先将数据分解为“条目”,然后为每个条目编写一个解析函数,只生成您希望在最终输出中看到的值。然后只需加入最终输出,或使用csv模块编写它。

input = """channel names:
03/02/2012 12:03:03 - TDS3k(CH1)
start times:
03/02/2012 12:33:11.169533
dt:
0.000000
data:
-8.000000E-4
-1.600000E-3
-1.600000E-3
channel names:
03/02/2012 12:03:03 - TDS3k(CH1)
start times:
03/02/2012 12:33:11.169533
dt:
0.000000
data:
-8.000000E-4
-1.600000E-3
-1.600000E-3
"""

LINES_PER_ENTRY = 10

def parseEntry(entry):
    return entry

raw = input.split('\n')

entries =  [raw[i*LINES_PER_ENTRY:(i+1)*LINES_PER_ENTRY] for i in range(len(raw)/10)]


parsed_entries = [parseEntry(entry) for entry in entries]

outfile = open('outfile.txt','w')
for parsed_entry in parsed_entries:
    outfile.write('\t'.join(parsed_entry) + "\n")
print parsed_entries