[英]Reading from a CSV file
我有一個包含許多行和列2的CSV文件,它們類似於:
Horizontal-1 Acc. Filename Horizontal-2 Acc. Filename RSN88_SFERN_FSD172.AT2 RSN88_SFERN_FSD262.AT2 RSN164_IMPVALL.H_H-CPE147.AT2 RSN164_IMPVALL.H_H-CPE237.AT2 RSN755_LOMAP_CYC195.AT2 RSN755_LOMAP_CYC285.AT2 RSN1083_NORTHR_GLE170.AT2 RSN1083_NORTHR_GLE260.AT2 RSN1614_DUZCE_1061-N.AT2 RSN1614_DUZCE_1061-E.AT2 RSN1633_MANJIL_ABBAR--L.AT2 RSN1633_MANJIL_ABBAR--T.AT2 RSN3750_CAPEMEND_LFS270.AT2 RSN3750_CAPEMEND_LFS360.AT2 RSN3757_LANDERS_NPF090.AT2 RSN3757_LANDERS_NPF180.AT2 RSN3759_LANDERS_WWT180.AT2 RSN3759_LANDERS_WWT270.AT2 RSN4013_SANSIMEO_36258021.AT2 RSN4013_SANSIMEO_36258111.AT2 RSN4841_CHUETSU_65004NS.AT2 RSN4841_CHUETSU_65004EW.AT2 RSN4843_CHUETSU_65006NS.AT2 RSN4843_CHUETSU_65006EW.AT2 RSN4844_CHUETSU_65007NS.AT2 RSN4844_CHUETSU_65007EW.AT2 RSN4848_CHUETSU_65011NS.AT2 RSN4848_CHUETSU_65011EW.AT2
在CSV文件中,我想查找標題“ Horizontal-1 Acc。Filename和Horizontal-2 Acc。Filename”,然后逐行獲取這些標題下的每一行的名稱?
有什么建議嗎?
謝謝RG。
package require csv
package require struct::matrix
::struct::matrix m
m add columns 2
set chan [open data.csv]
::csv::read2matrix $chan m
close $chan
lassign [m get row 0] header1 header2
for {set r 1} {$r < [m rows]} {incr r} {
puts -nonewline [format {%s = %-30s } $header1 [m get cell 0 $r]]
puts [format {%s = %s} $header2 [m get cell 1 $r]]
}
m destroy
我發現處理csv數據集的最簡單方法是使用matrix
。 matrix
是一種二維向量,具有內置的搜索,排序和重新排列列和行的內置向量。
首先,創建一個矩陣並將其命名為m
。 從一開始它將有兩列,但沒有行。
::struct::matrix m
m add columns 2
打開一個通道以讀取數據文件。 將通道和矩陣名稱傳遞給::csv::read2matrix
命令。 此命令將讀取csv數據,並為每個數據行創建一個矩陣行。 數據字段存儲在列中。
set chan [open data.csv]
::csv::read2matrix $chan m
close $chan
要獲取標題字符串,請檢索第0行。
lassign [m get row 0] header1 header2
要遍歷數據行,請從1(如果沒有標題,則為0)到m rows
,這是矩陣中的行數。
有一個方便的report
工具,可以很好地處理矩陣,但這里我只使用for
循環。 我猜你想如何呈現數據:
for {set r 1} {$r < [m rows]} {incr r} {
puts -nonewline [format {%s = %-30s } $header1 [m get cell 0 $r]]
puts [format {%s = %s} $header2 [m get cell 1 $r]]
}
如果矩陣處理完畢,則最好銷毀它。
m destroy
評論中針對特定問題的解決方案。
package require csv
package require struct::matrix
::struct::matrix m
set chan [open foo.csv]
::csv::read2matrix $chan m , auto
close $chan
set f1 [m search column 0 "Result ID"]
set headerRow [lindex $f1 0 1]
set f2 [m search rect 0 $headerRow 0 [expr {[m rows] - 1}] ""]
set f3 [m search row $headerRow "Horizontal-1 Acc. Filename"]
set f4 [m search row $headerRow "Horizontal-2 Acc. Filename"]
set top [expr {$headerRow + 1}]
set bottom [expr {[lindex $f2 0 1] - 1}]
set left [lindex $f3 0 0]
set right [lindex $f4 0 0]
puts [format {Vector=[ %s ]} [concat {*}[m get rect $left $top $right $bottom]]]
m destroy
顯然,您需要將文件名更改為正確的名稱。 沒有錯誤處理:在這樣一個簡單的腳本中,最好讓腳本失敗並糾正所有錯誤。
解決第二個問題的方法如下:
package require csv
package require struct::matrix
::struct::matrix m
set chan [open _SearchResults.csv]
::csv::read2matrix $chan m , auto
close $chan
set f1 [m search column 0 {Result ID}]
set headerRow [lindex $f1 0 1]
set f2 [m search -glob rect 0 $headerRow 0 [expr {[m rows] - 1}] { These*}]
set numofRow [lindex $f2 0 1]
set headercol1 [m search row $headerRow { Horizontal-1 Acc. Filename}]
set headercol2 [m search row $headerRow { Horizontal-2 Acc. Filename}]
set indexheaderH1col [lindex $headercol1 0 0]
set indexheaderH2col [lindex $headercol2 0 0]
set rows [m get rect $indexheaderH1col [expr {$headerRow+1}] $indexheaderH2col [expr {$numofRow-1}]]
set rows [lmap row $rows {
lassign $row a b
list [string trim $a] [string trim $b]
}]
foreach row $rows {
puts [format {%-30s %s} {*}$row]
}
puts [format {Vector=[ %s ]} [concat {*}$rows]]
評論:
read2matrix
與auto
配合使用,則無需設置列數 lmap
命令的部分修復了以下問題: 文檔: +(運算符) , -(運算符) , <(運算符) , chan , close , concat , csv(程序包) , expr , for , format , incr , lassign , lindex , lmap(對於Tcl 8.5) , lmap , open , package , puts , set , struct :: matrix(package) , {*}(語法)
全部清除
package require csv
package require struct::matrix
::struct::matrix m
m add columns 2
set chan [open _SearchResults.csv]
::csv::read2matrix $chan m , auto
close $chan
set f1 [m search column 0 {Result ID}]
set headerRow [lindex $f1 0 1]
set f2 [m search rect 0 $headerRow 0 [expr {[m rows] - 1}] {}]
set numofRow [lindex [lindex $f2 0 1]]
set headercol1 [m search row $headerRow { Horizontal-1 Acc. Filename}]
set headercol2 [m search row $headerRow { Horizontal-2 Acc. Filename}]
set indexheaderH1col [lindex $headercol1 0 0]
set indexheaderH2col [lindex $headercol2 0 0]
set header1 [m get cell $indexheaderH1col $headerRow]
set header2 [m get cell $indexheaderH2col $headerRow]
for {set r [expr $headerRow+1]} {$r < [expr $numofRow-1]} {incr r} {
puts [format {%-30s %s} [m get cell $indexheaderH1col $r] [m get cell $indexheaderH2col $r]]
}
set vector [concat {*}[m get rect $indexheaderH1col [expr $headerRow+1] $indexheaderH2col [expr $numofRow-1]]]
puts [format {Vector=[ %s ]} [concat {*}[m get rect $indexheaderH1col [expr $headerRow+1] $indexheaderH2col [expr $numofRow-1]]]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.