使用 TextFieldParser 处理包含未转义双引号的字段

2023-11-24

我正在尝试使用导入 CSV 文件文本字段解析器。一个特定的 CSV 文件由于其非标准格式而给我带来了问题。相关 CSV 的字段用双引号括起来。当特定字段中有一组附加的未转义双引号时,就会出现此问题。

这是一个过于简单的测试用例,突出了这个问题。我正在处理的实际 CSV 文件的格式并不相同,并且有数十个字段,其中任何一个都可能包含这些可能棘手的格式问题。

TextReader reader = new StringReader("\"Row\",\"Test String\"\n" +
    "\"1\",\"This is a test string.  It is parsed correctly.\"\n" +
    "\"2\",\"This is a test string with a comma,  which is parsed correctly\"\n" +
    "\"3\",\"This is a test string with double \"\"double quotes\"\". It is parsed correctly\"\n" +
    "\"4\",\"This is a test string with 'single quotes'. It is parsed correctly\"\n" +
    "5,This is a test string with fields that aren't enclosed in double quotes.  It is parsed correctly.\n" +
    "\"6\",\"This is a test string with single \"double quotes\".  It can't be parsed.\"");

using (TextFieldParser parser = new TextFieldParser(reader))
{
    parser.Delimiters = new[] { "," };
    while (!parser.EndOfData)
    {
        string[] fields= parser.ReadFields();
        Console.WriteLine("This line was parsed as:\n{0},{1}",
            fields[0], fields[1]);
    }
}

无论如何,是否可以使用 TextFieldParser 正确解析具有此类格式的 CSV?


我同意 Hans Passant 的建议,即解析格式错误的数据不是您的责任。然而,根据稳健性原则,遇到这种情况的人可能会尝试处理特定类型的格式错误的数据。我在下面编写的代码适用于问题中指定的数据集。基本上,它会检测格式错误的行上的解析器错误,根据第一个字符确定是否用双引号引起来,然后手动拆分/剥离所有引起的双引号。

using (TextFieldParser parser = new TextFieldParser(reader))
{
    parser.Delimiters = new[] { "," };

    while (!parser.EndOfData)
    {
        string[] fields = null;
        try
        {
            fields = parser.ReadFields();
        }
        catch (MalformedLineException ex)
        {
            if (parser.ErrorLine.StartsWith("\""))
            {
                var line = parser.ErrorLine.Substring(1, parser.ErrorLine.Length - 2);
                fields = line.Split(new string[] { "\",\"" }, StringSplitOptions.None);
            }
            else
            {
                throw;
            }
        }
        Console.WriteLine("This line was parsed as:\n{0},{1}", fields[0], fields[1]);
    }
}

我确信可以编造一个失败的病态示例(例如,字段值中与双引号相邻的逗号),但任何此类示例在最严格的意义上可能都是不可解析的,而问题中给出的问题行是尽管格式错误但仍可辨认。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TextFieldParser 处理包含未转义双引号的字段 的相关文章

随机推荐

  • std::unordered_set 是否连续(如 std::vector)?

    我将指针存储在 std unordered set 中 我这样做是因为我不想要任何重复项 我删除集合中的指针 因此如果存在重复项 我将尝试删除已删除的指针 我大量循环遍历这些集合 并且因为我知道 std vector 是最快的循环容器 连续
  • 不同命名空间中模板的特化

    我正在使用 C 开发一个跨平台库 MSVC 编译得很好 但 g 给我带来了问题 假设我有以下 Enum 辅助类 File Enum h ifndef ENUM H define ENUM H include
  • javascript正则表达式匹配特定域名

    我一直在尝试制作一个正则表达式来将 URL 与特定域名相匹配 所以如果我想检查这个网址是否来自 example com 什么 reg exp 应该是最好的 此 reg exp 应匹配以下类型的 URL http api example co
  • 如何在新标签页上打开谷歌广告?

    每当访问者点击网站上的 Google 广告时 该广告就会在同一页面中打开 从而取代我的网站 我就会失去该访问者 我们是否可以采取一些措施 以便每当网站访问者点击 Google 广告时 它就会在新标签中打开 有什么脚本需要修改吗 我尝试了一个
  • MongoDB:具有稀疏值的唯一稀疏复合索引

    我正在尝试存储以下链接 URL hostname i imgur com webid qkELz jpg 我想要在这两个字段上有一个唯一且稀疏的复合索引 因为 的组合hostname and webid应该是独一无二的 webid总是会被查
  • ggplot2:geom_ribbon,alpha 取决于每个 x 沿 y 轴的数据密度

    ggplot2 中有没有一种方法可以根据点的密度生成具有不同 alpha 的 geom ribbon 或其他基于区域的 geom 以下代码生成 50 个有噪声的正弦波 每个样本具有随机 x 值 我不想绘制每一个点 因为我可能需要一千次或更多
  • 获取单个 Windows 应用程序当前音量输出级别,如音频混合器中所示

    我正在尝试编写一个 C 代码 该代码从每个访问声音输出的 Windows 应用程序输出当前的音频输出级别 如音量混合器不断变化的绿色条所示 该程序将每 10 毫秒检查一次 并输出如下内容 Windows Media Player 30 Mo
  • 比较 PHP 中的多维数组

    如何在 php 中比较多维数组 有简单的方法吗 我知道的最简单的方法 a b 请注意 您还可以使用 它们之间的区别是 With 双等于 顺序很重要 a array 0 gt a 1 gt b b array 1 gt b 0 gt a va
  • c recv() 读取直到出现换行符

    我正在用 C 语言编写 IRC 机器人 但遇到了障碍 在我的主函数中 我创建了套接字并连接 所有这些快乐的事情 然后我有一个 几乎 无限循环来读取从服务器发回的内容 然后我将读取的内容传递给辅助函数 processLine char lin
  • 在 jekyll 博客中支持标签的简单方法

    我正在使用标准 jekyll 安装来维护博客 一切都很顺利 但我真的很想标记我的帖子 I can使用 YAML Front Matter 标记帖子 但如何为每个标签生成可以列出该标签的所有帖子的页面 这是一个解决方案在单个页面上按字母顺序排
  • TableLayoutPanel 的行/列着色(vs2008、winform)

    我可以为 TableLayoutPanel 中的整个行或列添加特定颜色吗 如何 请提供示例代码 如果有 提前致谢 是的你可以 使用 TableLayoutPanel 的 CellPaint 事件来测试哪一行 列调用了该事件 然后使用矩形的
  • 使用 tf.trainable_variables() 显示可训练变量的名称

    我正在处理weights in a RNNCell 我有以下代码 var names for var in tf trainable variables var names append var name 在另一个名为model py 我正
  • 正则表达式验证密码强度

    我的密码强度标准如下 8个字符长度 2 个大写字母 1 个特殊字符 2 个数字 0 9 3 个小写字母 有人可以给我同样的正则表达式吗 密码必须满足所有条件 您可以使用积极的前瞻断言来执行这些检查 A Z A Z 0 9 0 9 a z a
  • 我如何在discord.py中创建一个有效的斜杠命令

    我正在尝试使用 discord py 创建斜杠命令 我已经尝试了很多东西 但它似乎不起作用 如有帮助 将不胜感激 注意 我将在最后包含 pycord 的版本 因为我认为它更简单 也是最初的答案 不和谐 py版本 首先确保您安装了最新版本的d
  • Algolia 搜索网络错误

    我正在将 Algolia 与我拥有的 Firebase 项目连接起来 我使用 Firebase Cloud Functions 来使 Algolia 索引与 Firebase 数据库中发生的所有更改保持同步 但每当我打电话 索引 saveO
  • 为什么 CMP(比较)有时会在 8086 汇编中设置进位标志?

    我一直在阅读 8086 指令集 它说 CMP 比较 可以设置进位标志 我知道比较会减去两个操作数 但我想知道在这种情况下是否有人可以提供一个示例 我只是无法理解添加数字和负数将设置进位标志的想法 我已经阅读了借用标志 但我只需要一个示例来阐
  • Bootstrap:移动显示上的列之间的间隙

    我正在使用 bootstrap 3 0 制作一个网站 我希望 HTML 和 CSS 能够在桌面 平板电脑和移动设备上清晰地看到 我遇到的一个问题是 当您在移动显示器上查看该网站时 该列会堆叠在一起 我并不是在批评它 因为它会尽可能地停止滚动
  • 白名单不适用于人行横道离子

    我使用 ionic 创建了一个工作应用程序 从我的网站获取数据没有问题 一切都很好 然后我去添加人行横道 现在当我在 Android 手机上运行它时出现错误 W XWalkCordovaResourceClient URL blocked
  • 无法从传输连接读取数据:控制台应用程序中的连接已关闭错误

    我在控制台应用程序中有这段代码 它在循环中运行 try HttpWebRequest request HttpWebRequest WebRequest Create search request Headers Add Accept La
  • 使用 TextFieldParser 处理包含未转义双引号的字段

    我正在尝试使用导入 CSV 文件文本字段解析器 一个特定的 CSV 文件由于其非标准格式而给我带来了问题 相关 CSV 的字段用双引号括起来 当特定字段中有一组附加的未转义双引号时 就会出现此问题 这是一个过于简单的测试用例 突出了这个问题