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

解析用C#中的引号括起来的CSV文件分享

时间:2023-04-10 19:47:54 C#

C#学习教程:在C#中解析被引号包围的CSV文件但是这个文件有点烦人……那么你如何解析这个CSV“1”,1/2/2010,“sample(“adasdad”)asdada”,“我在门口”Stinky,所以我会被诅咒,”“AK”在大多数情况下,最好的答案可能是@JimMischel。对于大多数遗留案例,TextFieldParser似乎正是您想要的——尽管它奇怪地存在于Microsoft.VisualBasic命名空间中!但这种情况并不常见。上次我遇到这个问题的一个变体时,我需要一些非常规的东西,我尴尬地放弃了正则表达式并通过字符检查删除了一个字符。有时,这还不够。如果您按字节推送,拆分字符串并不是真正的问题。所以我将案例重写为字符串扩展。我认为它非常接近。请注意,“我在门口大便‘臭’,所以我该死”是一个特别烦人的案例。如果没有下面的***STINKYCONDITION***代码,你会得到Iwaspoopedinthedoor“Stinkyasanvalue,soI'llbedamn”和另一个一样。对于任何匿名奇数拆分器/转义案例,唯一的方法是使用某种算法来确定每行中“通常”的列数,然后在这种情况下检查固定长度的字段,例如您的AK状态条目或其他一些可能的地标作为不一致列的规范化支持。但这可能是不需要的严肃的疯狂逻辑,尽管编码可以很有趣。正如@Vash指出的那样,您最好遵循一些标准并更积极地进行编码。但这里的问题可能比那更容易。唯一具有词法意义的情况是您的示例中的-",-双引号,逗号,然后是空格。这就是***STINKYCONDITION***代码检查的内容。即便如此,这段代码变得比我想要的更脏,这意味着你有奇怪的边缘情况,比如“这也很臭,”好吧,“现在怎么办?”哎呀,即使是“A”,“B”,“C”也没有也可以在这段代码中工作,iirc,因为我将开始和结束字符视为在前后固定时将它们转义了。所以我们基本上支持@Vash的评论!为单行if语句的所有括号道歉,但我现在被困在StyleCop世界中。我不一定建议您使用它-strictEscapeToSplitEvaluation加上STINKYCONDITION使这有点复杂。但值得注意的是,在引用方面很聪明的普通csv解析器更容易变得乏味,但在其他方面却微不足道。命名空间YourFavoriteNamespace{使用系统;使用System.Collections.Generic;使用系统文本;publicstaticclassExtensions{publicstaticQueueSplitSeeingQuotes(thisstringvalToSplit,charsplittingChar=',',charescapeChar='"',boolstrictEscapeutrue=Split,boolcaptureEndingNull=false){QueueqReturn=newQueue();StringBuilderstringBuilder=newStringBuilder();boolbInEscapeVal=false;for(inti=0;i0)){qReturn.Enqueue(stringBuilder.ToString());}returnqReturn;}}}可能值得一提的是“答案”你给自己的示例字符串中没有“Stinky”问题。;^)[我们问你们3年后],我想说你的例子并不像这里的人那么疯狂。我可以看到想要将转义字符(在本例中为“)”视为转义字符,前提是它们是拆分字符之后的第一个值,或者在找到开始转义之后,只有在拆分仅在找到转义字符时才停止在分隔符之前;在这种情况下,分隔符显然是,。如果您的csv行是abc,bc"a,ca"b,我希望这意味着我们有三个值:abc、bc"a和ca"b。在您的“示例(“adasdad”)asdada”列中有同样的处理-不开始和结束单元格值的引号不是转义字符,不一定需要加倍以保持意义。所以我在这里添加了一个strictEscapeToSplitEvaluation标志。请享用。;^)我强烈推荐使用TextFieldParser。使用String.Split或正则表达式的手动编码解析器在处理带有嵌入引号或嵌入分隔符的引用字段时几乎总是出错。但是,如果它处理您的特定示例,我会感到惊讶。正如其他人所说,这条线充其量是模棱两可的。基于“我会使用MyString.IndexOf("","然后对部分进行子字符串拆分。除此之外,我确定有人编写了一个可以处理此问题的csv解析器:)我找到了一种解析此格式错误的CSV方法的方法.我寻找一个模式并找到它......我首先用一个字符替换(“,”)......比如“¤”然后拆分它......从这个:“烦人”,“CSV文件”,“poop@mypants.com",1999,01-20-2001,"oh,boy",01-20-2001,"yeahbaby","yeah!"为此:“烦人的CSV文件poop@mypants.com”,1999,01-20-2001,“哦,男孩”,01-20-2001,“是的,宝贝,是的!”然后拆分它:ArrayA[0]:"Annoying//thisvaluewillbetrimmedbyreplace(""","")sameasthearray[4]ArrayA[1]:CSVFileArrayA[2]:poop@mypants.com",1999,01-20-2001,"oh,boy",01-20-2001,"yeahbabyArrayA[3]:yeah!"拆分后,我将替换ArrayA[2]中的字符串"和"在用ArrayA[2]拆分之前使用Array:poop@mypants.com",1999,01-20-2001,"oh,boy",01-20-2001,"yeahbabyonArrayA[2]:poop@mypants.com¤1999,01-20-2001¤oh,boy¤01-20-2001¤是的宝贝然后再次拆分并转向这个ArrayB[0]:poop@mypants.comArrayB[1]:1999,01-20-2001ArrayB[2]:oh,boyArrayB[3]:01-20-2001ArrayB[4]:yeahbaby最后...我将把ArrayB[1]中的年份和日期分成ArrayC这很乏味,但没有其他方法可以做到......你可以用","分割字符串。建议csv文件可以将每个单元格值括在引号中,例如“1”、“2”、“3”...如果每一行都不同,我不知道你怎么做。此行格式错误。值中包含的引号必须加倍,如下所示。我什至不知道价值应该在哪里结束。"1",1/2/2010,"样本(""adasdad"")asdada","我在门口大便""Stinky",所以我该死","AK"这就是我解析CSV文件的代码,但我没有看到任何代码如何知道如何处理您的行,因为它的格式不正确。您可能想尝试一下CsvReader。它将处理带引号的字符串,因此您只需要删除前导引号和尾随引号。如果您的字符串包含逗号,它将失败。为避免这种情况,如其他答案中所述,引号需要加倍。由于没有(正确的).csv解析器可以正确解析非csv数据,因此任务不是解析数据,而是解析文件(然后解析正确的数据)。要修复数据,您需要一个坏行列表(发送给负责人工编辑的垃圾处理员)。要获得这样的列表,您可以使用具有正确导入规范的Access导入文件。您将获得失败的导入列表。编写通过OLEDB文本驱动程序打开文件的脚本/程序。示例文件:"Id","Remark","DateDue"1,"Thisisgood",201104132,"Thisis""good""",201104143,"Thisis""good"","bad",and"ugly",,201104154,"Thisis""good"""again,20110415SampleSQL/results:以上就是C#学习教程:ParsingaCSVfileenclosedinquotesinC#shares,如果有用给你,你需要了解更多C#学习教程,希望你多多关注——SELECT*FROM[badcsv01.csv]IdRemarkDateDue1Thisisgood4/13/20112Thisis"good"4/14/20113Thisis"good",NULL4Thisisagain4/15/2011SELECT*FROM[badcsv01.csv]WHEREDateDueIsNullIdRemarkDateDue3Thisis"good",NULL这篇文章是收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: