当前位置: 首页 > 编程语言 > C#

在C#中拆分一个字符串Share

时间:2023-04-11 02:23:00 C#

在C#中拆分一个字符串假设CSV文件中有一行:"BarackObama",48,"President","1600PennAve,WashingtonDC"string[]tokens=line.split(',')我期待的是:"BarackObama"48"President""1600PennAve,WashingtonDC"但最后一个标志上写着'WashingtonDC'而不是"1600PennAve,WashingtonDC"。有没有一种简单的方法可以使拆分函数忽略引号内的逗号?我无法控制CSV文件,但它没有发送给我。客户A将使用该应用程序读取外部人员提供的文件。您可能必须编写自己的拆分函数。这是一个例子:publicstaticclassStringExtensions{publicstaticstring[]SplitQuoted(thisstringinput,charseparator,charquotechar){StringBuildersb=newStringBuilder();布尔转义=假;foreach(charcininput){if(c.Equals(separator)&&!escaped){//我们有一个标记tokens.Add(sb.ToString().Trim());sb.Clear();}elseif(c.Equals(separator)&&escaped){//忽略但添加到字符串sb.Append(c);}elseif(c.Equals(quotechar)){escaped=!escaped;sb.Append(c);}else{sb.Append(c);}}tokens.Add(sb.ToString().Trim());返回tokens.ToArray();}}然后调用:string[]tokens=line.SplitQuoted(',','"');基准测试下面我的代码和蛋涛的代码进行了基准测试。如果有人想要一个,我很乐意对任何其他解决方案进行基准测试?代码:stringinput=""BarakObama",48,"President","1600PennAve,WashingtonDC"";//Console.ReadLine()string[]tokens=null;//运行测试DateTimestart=DateTime.现在;for(inti=0;iOutput:1,000,000xSplitWithQualifier=8156.25ms1,000,000xSplitQuoted=2406.25ms我有一个SplitWithQualifier扩展方法,我在这里和那里使用它使用常规正则表达式。我没有声明此代码的健壮性,但是对我来说已经有一段时间了。//糟糕的代码无法滚动以适应publicstaticclassCsvSplitter{publicstaticstring[]SplitWithQualifier(thisstringtext,chardelimiter,charqualifier,boolstripQualifierFromResult){stringpattern=string.Format(@"{0}(?=(?:[^{1}]*{1}[^{1}]*{1})*(?![^{1}]*{1}))",Regex.Escape(delimiter.ToString()),Regex.Escape(qualifier.ToString()));string[]split=Regex.Split(text,pattern);如果(stripQualifierFromResult)返回split.Select(s=>s.Trim().Trim(qualifier)).ToArray();否则返回拆分;}}用法:stringcsv=""BarakObama",48,"President","1600PennAve,WashingtonDC"";string[]values=csv.SplitWithQualifier(',','"',true);foreach(stringvalueinvalues)Console.WriteLine(value);Output:BarakObama48President1600PennAve,WashingtonDC我从大局中看到您实际上是在尝试解析CSV输入...因此,我建议您使用CSV解析器来执行类似的操作,而不是建议如何正确拆分字符串。快速CSV阅读器我推荐的是可从这个CodeProject页面(源代码可用)获得的库:http://www.codeproject.com/KB/database/CsvReader.aspx我个人使用它并且喜欢它。它是.NET本机代码,比使用OLEDB快得多(它也可以为您进行CSV解析,但相信我,它很慢)。您应该使用Microsoft.VisualBasic.FileIO.TextFieldParser。它将为您正确处理所有CSV内容,请参阅:ExampleusingTextFieldParser中的类似问题PS:不要害怕在C#项目中使用Microsoft.VisualBasicdll,它都是.NET?您不能使用简单的逗号拆分来解析CSV行,因为某些单元格内容将包含逗号,这些逗号并非用于描述数据,但实际上是单元格内容本身的一部分。这是一个简单的基于正则表达式的C#方法的链接,该方法可将您的CSV转换为手动数据表:http://www.hotblue.com/article0000.aspx?a=0006使用数据表非常简单——如果您需要代码,请告诉我样品。这是预期的行为,因为引号只是C#中的另一个字符串字符。看起来您要查找的是引用标记或数字标记。我认为您可能需要使用Regex来拆分字符串,除非其他人知道更好的方法。或者您可以循环遍历字符串中的字符串,一次构建一个字符串并以此方式构建标记。这是老派,但可能是您情况下最可靠的方法。我建议使用正则表达式。它将允许您以更通用的方式提取更复杂的子字符串(如您所愿)。http://www.c-sharpcorner.com/uploadfile/prasad_1/regexppsd12062005021717am/regexppsd.aspxhttp://oreilly.com/windows/archive/csharp-regular-expressions.html你不能改变CSV的方式吗生成?使用OpenOffice,您可以设置字符定界符(使用;)以及字符串的分隔方式(使用“或”)。它会是这样的:“总统”;'1600PennAve,WashingtonDC'stringtemp=line.Replace(""","");string[]tokens=temp.Split(',')以上是C#学习教程:拆分字符串分享的所有内容C#,如果对你有用,需要了解更多C#学习教程,希望你多多关注---本文收集自网络,不代表立场,如涉及侵权请点击有权联系管理员删除,如需转载请注明出处: