首先,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。我怀疑如果标题包含空格也可能有问题。分栏符在文本中的位置,并发出一个新的文本文件,其中的空格字符恰好被单个制表符替换 - 即。10-16 被一个制表符替换,23-24 被另一个制表符替换,等等。生成的文件是制表符分隔的,即平凡的情况。我承认我只是在你的小案例数据上尝试过,复制到一个名为 ex.txt 的文本文件中;输出到 ex_.txt。我怀疑如果标题包含空格也可能有问题。分栏符在文本中的位置,并发出一个新的文本文件,其中的空格字符恰好被单个制表符替换 - 即。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