首先,Excel(2003年,在家)并不是那么聪明.如果您的列1000 * chi2包含空格,例如1000 * chi2,excel会猜错.
琐碎的情况:如果您的数据最初由制表符(而不是空格)分隔,并且多个制表符用于指示空列,那么,至少在TCL中,很容易按标签内容拆分每一行,我认为Python中也很简单.
但我猜你的问题是他们只使用了空格字符.
我看到解决这个问题的最大线索是将文本粘贴到记事本中并选择固定大小的字体.一切都整齐排列,您可以使用每行中的字符数作为“长度”的度量.
因此,如果您可以依赖输入的此功能,那么您可以使用“筛选”方法来自动识别列中断的位置.当你在第一遍中掠过线条时,请注意沿着非白色空间占据的线条的“位置”,如果它被非白色空间占据,则从列表中消除位置.当你走的时候,你会很快到达一组永远不被非空白占据的位置.那么,这些是你的列分隔符.在你的例子中,你的“筛子”最终会有10-16,23-24,32,42-47的位置从未被非空格占据(假设我可以计算).
因此,该集合的补充是您的数据必须位于的列位置集.
因此,在foreach行中,每个非空白块都将从上面确定的位置集(即补集集)中的某个列中适应.
我从来没有在Python中编码,所以附加的是一个TCL脚本,它将使用筛选方法识别文本中的列分隔符,并发出一个新的文本文件,其中正好用单个选项卡替换那些空格字符 – 即. 10-16替换为一个选项卡,23-24替换为另一个选项卡等.
生成的文件是以制表符分隔的,即简单的大小写.我承认我只是在你的小案例数据上尝试过,复制到一个名为ex.txt的文本文件中;输出转到ex_.txt.我怀疑如果标题包含空格也可能有问题.
希望这可以帮助!
set fh [open ex.txt]
set contents [read $fh];#ok for small-to-medium files.
close $fh
#first pass
set occupied {}
set lines [split $contents \n];#split contents at line breaks.
foreach line $lines {
set chrs [split $line {}];#split each line into chars.
set pos 0
foreach chr $chrs {
if {$chr ne " "} {
lappend occupied $pos
}
incr pos
}
}
#drop out with long list of occupied "positions": sort to create
#our sieve.
set datacols [lsort -unique -integer $occupied]
puts "occupied: $datacols"
#identify column boundaries.
set colset {}
set start [lindex $datacols 0];#first occupied pos might be > 0??
foreach index $datacols {
if {$start < $index} {
set end $index;incr end -1
lappend colset [list $start $end]
puts "col break starts at $start, ends at $end";#some instro!
set start $index
}
incr start
}
#Now convert input file to trivial case output file, replacing
#sieved space chars with tab characters.
set tesloc [lreverse $colset];#reverse the column list!
set fh [open ex_.txt w]
foreach line $lines {
foreach ele $tesloc {
set line [string replace $line [lindex $ele 0] [lindex $ele 1] "\t" ]
}
puts "newline is $line"
puts $fh $line
}
close $fh