我必须使用一个不能直接用于生成简单图表的 csv 文件。我需要将文件操作为“更干净”的东西并且遇到问题并且不确定我的整体策略是否正确,因为我只是在学习用 ruby 解析文件......我这里的问题主要与我寻找从我找到或未找到匹配项的位置偏移的数据。在找到符合标准的行后,我需要从其后的 2 行中读取信息并对其进行操作(将某些内容从最后一列移到第二列)。
这是原始的 csv 文件:
component
quantity header,design1,design2,design3,Ref,Units
quantity type,#,#,#,ref#,unit value
component
quantity header,design1,design2,design3,Ref,Units
quantity type,#,#,#,ref#,unit value
component
quantity header,design1,design2,design3,Ref,Units
quantity type,#,#,#,ref#,unit value
期望的输出:
Component Header,Quantity type Header,Units Header,design1 header,design2 header,design3 header,Ref header
component,quantity type,unit value,#,#,#,n/a
component,quantity type,unit value,#,#,#,n/a
component,quantity type,unit value,#,#,#,n/a
component,quantity type,unit value,#,#,#,n/a
component,quantity type,unit value,#,#,#,n/a
我目前的红宝石脚本:
require 'csv'
f = File.new("sp.csv")
o = CSV.open('output.csv', 'w')
f.each_line do |l| #iterate through each line
data = l.split
if l !~ /,/ #if the line does not contain a comma it is a component
o << [data,f.gets] #start writing data, f.gets skips next line but need to skip 2 and split the line to manipulate columns
else
o << ['comma'] #just me testing that I can find lines with commas
end
end
f.gets 跳过下一行,文档不清楚如何使用它来跳过 2。之后我认为我可以用逗号分隔该行并使用数组 [column] 操作行数据。除了这个抵消问题,我也不确定我的一般方法是否是一个好策略
编辑
这是真实文件中的一些行...。我将研究提供的答案,看看是否可以使所有工作正常进行。我的想法是逐行读取和写入,而不是将整个文件转换为数组然后读取和写入。我的想法是,当这些文件变大时,它们会占用更少的内存。
感谢您的帮助,我将解决答案并回复您。
DCB
Result Quantity,BL::BL,BL::BL_DCB-noHeat,DC1::DC1,DC2::DC2,noHS::noHS,20mmHS::20mmHS,Reference,Units
Avg Temperature,82.915,69.226,78.35,78.383,86.6,85.763,N/A,Celsius
RCB
Result Quantity,BL::BL,BL::BL_DCB-noHeat,DC1::DC1,DC2::DC2,noHS::noHS,20mmHS::20mmHS,Reference,Units
Avg Temperature,76.557,68.779,74.705,74.739,80.22,79.397,N/A,Celsius
Antenna
Result Quantity,BL::BL,BL::BL_DCB-noHeat,DC1::DC1,DC2::DC2,noHS::noHS,20mmHS::20mmHS,Reference,Units
Avg Temperature,69.988,65.045,69.203,69.238,73.567,72.777,N/A,Celsius
PCBA_fiberTray
Result Quantity,BL::BL,BL::BL_DCB-noHeat,DC1::DC1,DC2::DC2,noHS::noHS,20mmHS::20mmHS,Reference,Units
Avg Temperature,66.651,65.904,66.513,66.551,72.516,70.47,N/A,Celsius
编辑 2
使用下面答案中的一些正则表达式,我开发了一种逐行策略来解析它。为了完整起见,我将其发布为答案。
感谢您提供帮助并让我了解开发解决方案的方法