Ruby Rspec CSV解析器语法错误排查与修复求助
原始代码与问题
测试代码
describe "bashing outing the strings" do it " inputs" do expect(guess_csv("100,24,32\n42,52,62", ",", "\\\"")).to eq([["100", "24", "32"], ["42", "52", "62"]]) end end
实现代码(存在语法与逻辑错误)
def parse_csv(csv, separator, quote) final_array = [] lines = ("100,24,32\n42,52,62", ",", "\\\"", quote: "'", separator: ",").split(/\,\n/).map(&:parse_csv) do |line| line.split(',') final_array << line.scan(/\,\n/) end final_array end
运行错误信息
An error occurred while loading spec_helper.
Failure/Error: require 'solution'An error occurred while loading spec_helper.
Failure/Error: require 'servertime'SyntaxError:
/chicago/default/lib/servertime.rb:3: syntax error, unexpected ',', expecting ')'
...lines = ("100,24,32\n42,52,62", ",", """", quote: "'", sepa...
... ^
/chicago/default/lib/servertime.rb:3: syntax error, unexpected ',', expecting ')'
... = ("100,24,32\n42,52,62", ",", """", quote: "'", separator...
... ^
/chicago/default/lib/servertime.rb:3: syntax error, unexpected ',', expecting ')'
...00,24,32\n42,52,62", ",", """", quote: "'", separator: ",")...
... ^
/chicago/default/lib/servertime.rb:3: syntax error, unexpected ',', expecting ')'
...52,62", ",", """", quote: "'", separator: ",").split(/,\n/...
... ^
/chicago/default/lib/servertime.rb:6: both block arg and actual block given./spec/spec_helper.rb:1:in
require' ./spec/spec_helper.rb:1:in<top (required)>'No examples found.
No examples found.
错误分析与修复步骤
1. 语法错误修复
- 无效括号语法:第3行硬编码的多值括号写法违反Ruby语法,应使用函数传入的
csv参数,而非硬编码字符串。 - map方法冲突:同时使用
map(&:parse_csv)和块do |line|...end,Ruby不允许同时给map传递符号方法和块,需移除其中一个。 - 无意义转义:代码中硬编码的
\\\"无实际作用,应使用传入的quote参数处理引号逻辑。
2. 逻辑错误修复
- 参数未利用:函数定义了
csv、separator参数,但未使用,需替换硬编码内容为传入参数。 - 行分割错误:
split(/\,\n/)无法正确分割行,应使用split("\n")或split(/\R/)兼容所有换行格式。 - 字段分割错误:
line.scan(/\,\n/)无法提取字段,需改为用split(separator)按传入的分隔符分割每行。 - 方法名不匹配:测试代码调用
guess_csv,但实现的函数是parse_csv,需统一方法名称。
修复后的代码
实现代码
def guess_csv(csv, separator, quote) final_array = [] # 按换行符分割所有行 lines = csv.split("\n") lines.each do |line| # 按传入的分隔符分割每行字段 fields = line.split(separator) final_array << fields end final_array end
调整后的测试代码(保持方法名一致)
describe "bashing outing the strings" do it "parses CSV correctly" do expect(guess_csv("100,24,32\n42,52,62", ",", "\\\"")).to eq([["100", "24", "32"], ["42", "52", "62"]]) end end
补充说明
如果需要处理带引号的复杂CSV(比如字段包含分隔符的情况),可以进一步扩展逻辑,比如判断字段是否被引号包裹,处理内部的分隔符。当前修复后的代码可满足基础CSV分割需求,通过测试用例。
内容的提问来源于stack exchange,提问作者hollowasm

