【问题标题】:Delimit a string by character unless within quotation marks C#除非在引号内,否则按字符分隔字符串 C#
【发布时间】:2015-06-29 14:57:41
【问题描述】:

我需要用一个字符(逗号)来使文本非军事化。但我只想使用逗号作为分隔符,如果它没有用引号封装。

一个例子:

Method,value1,value2

将包含三个值:Method、value1 和 value2

但是:

Method,"value1,value2"

将包含两个值:Method 和“value1,value2”

我不确定如何处理这个问题,因为在拆分我将使用的字符串时:

String.Split(',');

但这会基于所有逗号来消除军事化。这是否可能而不会变得过于复杂并且不必手动检查字符串的每个字符。

提前致谢

【问题讨论】:

标签: c# csv


【解决方案1】:

复制自我的评论:使用可用的 csv 解析器,例如 VisualBasic.FileIO.TextFieldParserthisthis

根据要求,这是TextFieldParser 的示例:

var allLineFields = new List<string[]>();
string sampleText = "Method,\"value1,value2\"";
var reader = new System.IO.StringReader(sampleText);
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader))
{
    parser.Delimiters = new string[] { "," };
    parser.HasFieldsEnclosedInQuotes = true; // <--- !!!
    string[] fields;
    while ((fields = parser.ReadFields()) != null)
    {
        allLineFields.Add(fields);
    }
}

此列表现在包含一个带有两个字符串的 string[]。我使用了StringReader,因为此示例使用字符串,如果源是文件,请使用StreamReader(例如,通过File.OpenText)。

【讨论】:

  • 你不知道为什么像这样有用的类会隐藏在 VisualBasic 命名空间中吗?
  • @JamesThorpe:你问错人了。这只能由属于 VB.NET/C# 编译器团队的人来回答。我想这样的实用程序类对 VB.NET 很重要,但对 C# 人来说并不重要。但是,由于它属于 .NET 框架,因此您也可以通过添加对 Microsoft.VisualBasic.dll 的引用将其与 C# 一起使用。
  • 是的,很公平——当我看到这样的东西而不是更广泛框架的“一部分”时,总是显得很奇怪。我可以理解提出 VB6 风格功能等的事情,但不是这样的事情。无论如何...这里的题外话。
  • 非常感谢,这正是我一直在寻找的工作,而且很容易采用自己的方法。 :) 我也想知道为什么它只在 VisualBasic 命名空间中可用
【解决方案2】:

您可以尝试Regex.Split() 使用模式拆分数据

",|(\"[^\"]*\")" 

这将由逗号和引号内的字符分隔。

代码示例:

using System;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string data = "Method,\"value1,value2\",Method2";
        string[] pieces = Regex.Split(data, ",|(\"[^\"]*\")").Where(exp => !String.IsNullOrEmpty(exp)).ToArray();

        foreach (string piece in pieces)
        {
            Console.WriteLine(piece);
        }
    }
}

结果:

Method
"value1,value2"
Method2

Demo

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2014-10-10
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多