簡體   English   中英

如何使用 Ruby 對 csv 文件中的值求和

[英]How to sum values from csv file with Ruby

我有一個包含幾列的 Csv 文件。 第 4 列具有我想要解析的格式。 下面的字符串str將是文件的一行:

str = "108,882,xyz, { Abc:{-} Val1:{6845} Val2:{653} llsh:{0} xTime: {2018-11-10 09:56:12} Yub:{Rtv} Val1:{807} Val2:{153} llsh:{0} xTime: {2018-11-10 09:59:05}A Wbc:{57} Val1:{441} Val2:{875} llsh:{0} xTime: {2018-11-10 10:13:12:22}"

對於第 4 列,我想對字符串中存在的所有 Val1 和 Val2 求和,並將第一個和最后一個日期顯示為新列。 如果Val1 和Val2 只出現一次,則需要求和,輸出將是Val1、Val2 和xTime 的值。

輸出將是:

Col1, Col2, Col3, Val1,  Val2 , xTime
108,  882,  xyz,  8093,  16821, 2018-11-10 09:56:12 - 2018-11-10 10:13:12:22

我正在嘗試使用 CSV.parse。

require 'csv'

CSV.parse(str)

For 4th column do
       //Parse

我怎樣才能在 Ruby 中做到這一點?

謝謝你的幫助

這個問題的本質是從"108,882,xyz, "的字符串部分提取所需的信息,而不是如何解析 CSV 字符串,所以我將把注意力集中在前者上。

r = /
    Val1:\{                      # match string
    (\d+)                        # match > 0 digits in capture group 1 
    \}\ +Val2:\{                 # match string
    (\d+)                        # match > 0 digits in capture group 2
    \}\ +[^\}]+\}\ +xTime:\ +\{  # match string
    (.+?)                        # match > 0 characters lazily in capture group 3
    \}                           # match string
    /x                           # free-spacing regex definition mode

這個正則表達式通常寫成如下:

/Val1:\{(\d+)\} +Val2:\{(\d+)\} +[^\}]+\} +xTime: +\{(.+?)\}/

請注意,在使用自由間距模式時,如果未以某種方式保護空格字符,解析器將剝離它們。 有幾種方法可以保護它們。 我選擇轉義每個空格字符。 自由間距模式的優點是它使正則表達式自記錄。

a = str.scan(r)
  #=> [["6845", "653", "2018-11-10 09:56:12"],
  #    [ "807", "153", "2018-11-10 09:59:05"],
  #    [ "441", "875", "2018-11-10 10:13:12:22"]]

val1, val2, (f,*,l) = a.transpose
  #=> [["6845", "807", "441"],
  #    [ "653", "153", "875"],
  #    ["2018-11-10 09:56:12", "2018-11-10 09:59:05", "2018-11-10 10:13:12:22"]]
val1
  #=> ["6845", "807", "441"] 
val2
  #=> ["653", "153", "875"] 
f #=> "2018-11-10 09:56:12" 
l #=> "2018-11-10 10:13:12:22" 

def convert(arr)
  arr.map(&:to_i).sum
end

convert(val1)
  #=> 8093 
convert(val2)
  #=> 1681 
"%s - %s" % [f,l]
  #=> "2018-11-10 09:56:12 - 2018-11-10 10:13:12:22"

請參閱String#scan

暫無
暫無

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

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