You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助开发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:24:47