从文本文件中读取特定列的数据并写入另一个文本文件tcl

从文本文件中读取特定列的数据并写入另一个文本文件tcl,tcl,Tcl,通过使用Tcl。例如,我有数据 hello;world;123 test;code;456 我只想得到第一列的值并将其写入另一个文本文件。输出将是这样的 hello test 您只需读取输入文件: set pfi [open "file_name" "r"] set cnt [gets $pfi row] 然后过滤第一个单词: set word [lindex [split $row ";"] 0] 然后写入输出文件 set pfo [open "file_out_name" "w"]

通过使用Tcl。例如,我有数据

hello;world;123
test;code;456
我只想得到第一列的值并将其写入另一个文本文件。输出将是这样的

hello
test

您只需读取输入文件:

set pfi [open "file_name" "r"]
set cnt [gets $pfi row]
然后过滤第一个单词:

set word [lindex [split $row ";"] 0]
然后写入输出文件

set pfo [open "file_out_name" "w"]
puts $pfo $word
您可以使用cnt来知道文件是否即将结束(当cnt<0时,文件结束),这样您就可以迭代文件的所有行。当然,最后有必要关闭文件:

close $pfi
close $pfo
因此,结合所有步骤:

set pfi [open "file_in_name" "r"]
set pfo [open "file_out_name" "w"]
while {1 == 1} {
    set cnt [gets $pfi row]
    if {$cnt < 0} {break}
    set word [lindex [split $row ";"] 0]
    puts $pfo $word
}
close $pfi
close $pfo
设置pfi[在文件名“r”中打开“文件”]
设置pfo[打开“文件名”“w”]
而{1==1}{
设置cnt[获取$pfi行]
如果{$cnt<0}{break}
设置字[lindex[split$行”;“]0]
放入$pfo$字
}
收盘价$pfi
关闭$pfo

您只需读取输入文件:

set pfi [open "file_name" "r"]
set cnt [gets $pfi row]
然后过滤第一个单词:

set word [lindex [split $row ";"] 0]
然后写入输出文件

set pfo [open "file_out_name" "w"]
puts $pfo $word
您可以使用cnt来知道文件是否即将结束(当cnt<0时,文件结束),这样您就可以迭代文件的所有行。当然,最后有必要关闭文件:

close $pfi
close $pfo
因此,结合所有步骤:

set pfi [open "file_in_name" "r"]
set pfo [open "file_out_name" "w"]
while {1 == 1} {
    set cnt [gets $pfi row]
    if {$cnt < 0} {break}
    set word [lindex [split $row ";"] 0]
    puts $pfo $word
}
close $pfi
close $pfo
设置pfi[在文件名“r”中打开“文件”]
设置pfo[打开“文件名”“w”]
而{1==1}{
设置cnt[获取$pfi行]
如果{$cnt<0}{break}
设置字[lindex[split$行”;“]0]
放入$pfo$字
}
收盘价$pfi
关闭$pfo
啊,好吧

有几种方法可以做到这一点。如果您使用的是类unix平台,则从Tcl或shell脚本内部使用
cut
命令是正确的方法。当然,Tcl也可以做到这一点,尽管没有那么方便(脚本很难与实用程序竞争)

最简单的解决方案利用了
fileutil
,这是世界上最被低估的软件包之一:

package require fileutil
namespace import ::fileutil::*
一个命令,
foreachLine
,允许我们对文件中的每一行(
data.old
)执行一些操作:

我们在这里所做的是将每一行上查找的单词附加到另一个文件(
data.new

我们还可以在命令的帮助下就地编辑文件,该命令将文件内容拆分为行,将每行截断为第一个子字符串,直至分号,然后重新连接行:

proc cmd data {
    join [lmap line [split [string trim $data] \n] {
        lindex [split $line \;] 0
    }] \n
}
然后我们这样做(请注意,这将替换原始内容):

这有点复杂,但对于不是严格意义上的线对线操作来说是实用的

另外两个包对字符分隔数据很有帮助:
csv
导入数据集,以及
struct::matrix
操作数据

package require csv
package require struct::matrix

::struct::matrix m
将数据导入矩阵
m
(由于包是如何定义的,我们需要在这里处理通道):

从矩阵中获取第一列:

set data [m get column 0]
将截断的数据写入文件:

writeFile data.new [join $data \n]
当然,也可以用低级别、核心的Tcl方式来实现这一点。此解决方案与Andrea Tosoni的类似,但更为惯用

set old [open data.old]
set new [open data.new w]
while {[chan gets $old line] >= 0} {
    chan puts $new [lindex [split $line \;] 0]
}
chan close $old
chan close $new
文档:,包,包,,,更换,,,包,

有几种方法可以做到这一点。如果您使用的是类unix平台,则从Tcl或shell脚本内部使用
cut
命令是正确的方法。当然,Tcl也可以做到这一点,尽管没有那么方便(脚本很难与实用程序竞争)

最简单的解决方案利用了
fileutil
,这是世界上最被低估的软件包之一:

package require fileutil
namespace import ::fileutil::*
一个命令,
foreachLine
,允许我们对文件中的每一行(
data.old
)执行一些操作:

我们在这里所做的是将每一行上查找的单词附加到另一个文件(
data.new

我们还可以在命令的帮助下就地编辑文件,该命令将文件内容拆分为行,将每行截断为第一个子字符串,直至分号,然后重新连接行:

proc cmd data {
    join [lmap line [split [string trim $data] \n] {
        lindex [split $line \;] 0
    }] \n
}
然后我们这样做(请注意,这将替换原始内容):

这有点复杂,但对于不是严格意义上的线对线操作来说是实用的

另外两个包对字符分隔数据很有帮助:
csv
导入数据集,以及
struct::matrix
操作数据

package require csv
package require struct::matrix

::struct::matrix m
将数据导入矩阵
m
(由于包是如何定义的,我们需要在这里处理通道):

从矩阵中获取第一列:

set data [m get column 0]
将截断的数据写入文件:

writeFile data.new [join $data \n]
当然,也可以用低级别、核心的Tcl方式来实现这一点。此解决方案与Andrea Tosoni的类似,但更为惯用

set old [open data.old]
set new [open data.new w]
while {[chan gets $old line] >= 0} {
    chan puts $new [lindex [split $line \;] 0]
}
chan close $old
chan close $new

文档:、程序包、程序包、、替换、、程序包、

@HappyCoder想要获取用于比较的特定数据列=)这不是代码编写服务。在询问之前,您应该自己尝试过解决问题。@HappyCoder想要获得用于比较的特定数据列=)这不是代码编写服务。在提出问题之前,你应该自己尝试解决这个问题。