[英]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.