请求协助开发Ruby CSV解析器验证器并排查语法错误
开发Ruby CSV解析器验证器并修复语法错误
需求概述
需要实现一个Ruby CSV解析器验证器,具备以下功能:
- 支持带引号字段的合法Ruby CSV解析函数
- 可处理逗号分隔符的Ruby CSV解析器验证函数
- 可处理替代分隔符的Ruby CSV解析器验证函数
现有测试用例
describe "CSV parser tests" do it "parses basic comma-separated CSV with default quote character" do expect(ashanti("12,22,33\n44,55,66", ",", "\"")).to eq([["12", "22", "33"], ["44", "55", "66"]]) end end
遇到的语法错误
An error occurred while loading spec_helper.
Failure/Error: require 'solution'SyntaxError:
/workspace/default/lib/ashanti.rb:4: syntax error, unexpected ',', expecting ')'
("12,22,33\n44, 55,66", ",", """).scan(/((?:\.|[^,...
^
/workspace/default/lib/ashanti.rb:4: syntax error, unexpected ',', expecting ')'
("12,22,33\n44,55,66", ",", """).scan(/((?:\.|[^,])*,?...
错误原因:你错误地将测试用的示例数据硬编码到了字符串scan调用中,而Ruby的String#scan方法仅接受一个正则参数,多参数传递直接触发语法错误。正确的做法是定义ashanti方法接收CSV内容、分隔符、引号字符三个参数,动态生成解析逻辑。
完整解决方案
以下是符合需求的ashanti方法实现,支持带引号字段、自定义分隔符和引号字符:
def ashanti(csv_content, delimiter, quote_char) # 转义正则特殊字符,避免分隔符/引号为元字符时出错 escaped_delimiter = Regexp.escape(delimiter) escaped_quote = Regexp.escape(quote_char) # 构造字段匹配正则:兼容带引号和普通字段 field_regex = / (?: #{escaped_quote} (?:\\.|[^#{escaped_quote}])* #{escaped_quote} | [^#{escaped_delimiter}\n]* ) /x csv_content.split("\n").map do |line| next [] if line.strip.empty? line.scan(field_regex).map do |field| field = field.first # 处理带引号的字段:移除前后引号,替换内部转义的双引号 if field.start_with?(quote_char) && field.end_with?(quote_char) field[1..-2].gsub("#{quote_char}#{quote_char}", quote_char) else field.strip end end end end
代码说明
- 正则转义:对分隔符和引号做转义处理,确保
|、*这类正则元字符作为分隔符时能正常解析。 - 字段匹配逻辑:正则分为两部分,一部分匹配带引号的字段(支持内部用双引号转义单个引号,比如
"hello""world"解析为hello"world),另一部分匹配普通非引号字段。 - 行处理:按换行分割CSV内容,逐行扫描字段,自动处理带引号字段的格式转换。
扩展测试验证
除了基础测试,可添加更多场景覆盖复杂情况:
describe "CSV parser tests" do it "parses basic comma-separated CSV with default quote character" do expect(ashanti("12,22,33\n44,55,66", ",", "\"")).to eq([["12", "22", "33"], ["44", "55", "66"]]) end it "parses CSV with quoted fields containing commas" do expect(ashanti('"John, Doe",30,"New York"', ",", "\"")).to eq([["John, Doe", "30", "New York"]]) end it "parses CSV with custom delimiter" do expect(ashanti("12;22;33\n44;55;66", ";", "\"")).to eq([["12", "22", "33"], ["44", "55", "66"]]) end it "parses CSV with escaped quotes in fields" do expect(ashanti('"He said ""Hello""",25', ",", "\"")).to eq([["He said \"Hello\"", "25"]]) end end
内容的提问来源于stack exchange,提问作者Ashanti
相关产品推荐
相关产品推荐

