簡體   English   中英

Ruby通過標頭值解析csv

[英]Ruby parse csv by header values

我正在研究一種獲取CSV文件(帶有標題)並使用Ruby CSV.parse解析的方法,但是我只想保存特定的列。

CSV看起來像這樣:

NAME,SUPERNET_IP,POP_NAME,ADDRESS_BLOCK_START,ADDRESS_BLOCK_END,Service,ISP Service ID,WCC,DUNSID
Retail,186.43.168.0,text1,186.43.168.0,186.43.175.255,XYZ,XYZB00090095,Enabled,227015716
Retail,186.57.80.0,text2,186.57.80.0,186.57.87.255,XYZ,XYXB00090095,Enabled,227015716

而我要保留的唯一字段是:

POP_NAME,ADDRESS_BLOCK_START,ADDRESS_BLOCK_END,WCC

有沒有一種方法可以通過特定的標頭名稱在CSV中進行解析,例如:

mycsv = CSV.parse(csv_data, {:headers => true, (list of headers to keep here) })

本示例假設csv_data是由上述示例CSV形成的字符串。

作為權宜之計,我只是將CSV轉換為數組數組,但這並不是我真正想要的。 我寧願將其保留為CSV對象。

myreturnedcsv = []
mycsv = CSV.parse(csv_data, {:headers => true, })
mycsv.each do |row|
  myreturnedcsv.push([row[2], row[3], row[4],row[7]])
end

請嘗試smarter_csv gem /解析器。 這具有忽略輸入(刪除列)中的“列”的功能https://github.com/tilo/smarter_csv

僅使用stdlib,就可以在列模式(而不是默認的混合模式)下使用CSV::Table對象。 在列模式下,迭代方法將產生兩個元素元組,其中包含列名和該列的值數組。

考慮到這一點,我們可以編寫如下內容:

# column names to keep
columns_to_keep = %w(POP_NAME ADDRESS_BLOCK_START ADDRESS_BLOCK_END WCC)

# get the data
mycsv = CSV.parse(csv_data, :headers => true)

# change to column mode, filter by column name and change back to default
# mode of operation
mycsv.by_col!.delete_if do |col_name, col_values|
  !columns_to_keep.include?(col_name)
end.by_col_or_row!   

最后一步是可選的,僅使表對象處於默認模式,在該模式下我們可以照常進行迭代(按行)。

我實際上不知道這種方法在處理大型數據集時是否可能會遇到性能/內存問題。

您可以在CSV :: Table的文檔中找到有關行/列/混合訪問的更多信息。

希望能幫助到你。

我會做一些數組切片:

require 'csv'

csv_data = <<EOT
NAME,SUPERNET_IP,POP_NAME,ADDRESS_BLOCK_START,ADDRESS_BLOCK_END,Service,ISP Service ID,WCC,DUNSID
Retail,186.43.168.0,text1,186.43.168.0,186.43.175.255,XYZ,XYZB00090095,Enabled,227015716
Retail,186.57.80.0,text2,186.57.80.0,186.57.87.255,XYZ,XYXB00090095,Enabled,227015716
EOT

data = []
CSV.parse(csv_data) do |row|
  data << [ *row[2 .. 4], row[-2] ]
end

require 'pp'
pp data

哪個回報:

[["POP_NAME", "ADDRESS_BLOCK_START", "ADDRESS_BLOCK_END", "WCC"],
["text1", "186.43.168.0", "186.43.175.255", "Enabled"],
["text2", "186.57.80.0", "186.57.87.255", "Enabled"]]

我讓CSV返回標頭,以便更輕松地查看代碼的作用。 使用常規的new選項關閉頁眉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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