簡體   English   中英

從CSV文件讀取

[英]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文件中,我想查找標題“ Horizo​​ntal-1 Acc。Filename和Horizo​​ntal-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]]

評論:

  • 如果將read2matrixauto配合使用,則無需設置列數
  • 在此文件中,表之后沒有空單元格。 相反,我們需要搜索以“這些”開頭的字符串
  • 由於每個單元格都包含一個空格字符,后跟值,因此我們需要在值周圍剪裁空格,否則串聯將出錯。 使用lmap命令的部分修復了以下問題:
  • 時刻保持表情

文檔: +(運算符)-(運算符)<(運算符)chancloseconcatcsv(程序包)exprforformatincrlassignlindexlmap(對於Tcl 8.5)lmapopenpackageputssetstruct :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM