C# 在忽略引号之间的逗号时,如何拆分(';,';)字符串?
我正在对一个字符串使用C# 在忽略引号之间的逗号时,如何拆分(';,';)字符串?,c#,string,split,C#,String,Split,我正在对一个字符串使用.Split(',')方法,我知道该字符串的值由逗号分隔,我希望这些值被分隔并放入字符串[]对象中。这对以下字符串非常有效: 78969.82,GW440, 但是,当第二个值超过1000时,这些值开始看起来不同,如本例中所示: 79,“1013.42”,GW450, 这些值来自一个电子表格控件,我在其中使用ExportToCsv(…)方法中内置的控件,这就解释了为什么实际数值的格式化版本 问题: 有没有办法让.Split(',')方法忽略引号中的逗号?实际上,我不希望将值“
.Split(',')
方法,我知道该字符串的值由逗号分隔,我希望这些值被分隔并放入字符串[]
对象中。这对以下字符串非常有效:
78969.82,GW440,
但是,当第二个值超过1000时,这些值开始看起来不同,如本例中所示:
79,“1013.42”,GW450,
这些值来自一个电子表格控件,我在其中使用ExportToCsv(…)
方法中内置的控件,这就解释了为什么实际数值的格式化版本
问题:
有没有办法让.Split(',')
方法忽略引号中的逗号?实际上,我不希望将值“1013.42”
拆分为“1
和013.42”
有什么想法吗?谢谢
更新
我真的希望在不合并第三方工具的情况下这样做,因为我的用例实际上不涉及除此之外的许多其他案例,即使它是我工作解决方案的一部分,合并这样的工具目前对任何人都没有真正的好处。我本来希望能有一些快速的方法来解决我遗漏的这个特定用例,但现在是周末,我将看看是否能在周一用我最终提出的解决方案对这个问题进行一次更新。感谢大家迄今为止的帮助,我将在周一对每个答案进行进一步评估。由于您正在阅读CSV文件,最好使用现有的CSV阅读器。CSV不仅仅是引号之间的逗号。找到你需要处理的所有案件将比它的价值更大
您可能应该阅读这篇文章:
虽然它是针对Java的,但是正则表达式是一样的 这是一个相当直接的CSV阅读器实现,我们在这里的几个项目中使用。易于使用和处理您正在谈论的案例 首先是CSV类
public static class Csv
{
public static string Escape(string s)
{
if (s.Contains(QUOTE))
s = s.Replace(QUOTE, ESCAPED_QUOTE);
if (s.IndexOfAny(CHARACTERS_THAT_MUST_BE_QUOTED) > -1)
s = QUOTE + s + QUOTE;
return s;
}
public static string Unescape(string s)
{
if (s.StartsWith(QUOTE) && s.EndsWith(QUOTE))
{
s = s.Substring(1, s.Length - 2);
if (s.Contains(ESCAPED_QUOTE))
s = s.Replace(ESCAPED_QUOTE, QUOTE);
}
return s;
}
private const string QUOTE = "\"";
private const string ESCAPED_QUOTE = "\"\"";
private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };
}
然后是一个非常好的阅读器实现——如果您需要的话。您应该能够用上面的CSV类做您需要的事情
public sealed class CsvReader : System.IDisposable
{
public CsvReader(string fileName)
: this(new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
}
public CsvReader(Stream stream)
{
__reader = new StreamReader(stream);
}
public System.Collections.IEnumerable RowEnumerator
{
get
{
if (null == __reader)
throw new System.ApplicationException("I can't start reading without CSV input.");
__rowno = 0;
string sLine;
string sNextLine;
while (null != (sLine = __reader.ReadLine()))
{
while (rexRunOnLine.IsMatch(sLine) && null != (sNextLine = __reader.ReadLine()))
sLine += "\n" + sNextLine;
__rowno++;
string[] values = rexCsvSplitter.Split(sLine);
for (int i = 0; i < values.Length; i++)
values[i] = Csv.Unescape(values[i]);
yield return values;
}
__reader.Close();
}
}
public long RowIndex { get { return __rowno; } }
public void Dispose()
{
if (null != __reader) __reader.Dispose();
}
//============================================
private long __rowno = 0;
private TextReader __reader;
private static Regex rexCsvSplitter = new Regex(@",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))");
private static Regex rexRunOnLine = new Regex(@"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$");
}
注意:这将打开一个现有的CSV文件,但可以很容易地进行修改,以获取所需的
字符串[]
。您正在寻找一个CSV解析器。Jake的可能重复项可能重复。。。看看这是否对你有帮助。。。有几种方法可以分割:使用RegEx处理CSV就像使用工业起重机在后院建造工具棚一样。
var reader = new CsvReader(new FileStream(file, FileMode.Open));