【发布时间】:2020-11-05 17:55:32
【问题描述】:
好的,为了简短起见,这是我的问题。提前道歉,因为我不在我的工作站旁边,并且无法按照我最初的计划附加来自调试器的图像。
我的工作要求我们处理大量 CSV/Excel 文件。我们获取这些文件,将它们放入我们的一个程序中,以更改格式等,然后我们将这些文件插入到我们的数据库中以生成报告。
我的程序的简短描述:在我们对其进行任何进一步操作之前,它需要验证 CSV 文件是否具有正确的标题。它需要有一个带有一些文本和数字的单元格。如果该数字不存在,程序会从文件的另一行读取它,因为它存在于那里,我只是使用该值手动创建标题。
每当我从文件中读取值时,我都会得到我需要的值,但它有一个不需要的反斜杠。不幸的是,我无法从调试器中附加图片,但它看起来有点像括号中的内容(“”11111111“”)。现在,正如其他人在其他线程中提到的那样,当我将值打印到控制台甚至消息框时,斜线和额外的引号不存在。我需要将值转换为数字,所以我尝试使用 string.Repalce() 来去掉斜线和多余的引号。
我可以这样做:
accountNo = accountNo.Replace(@"\", "");
但这并不能解决多余引号的问题。因为当我尝试这样做时:
accountNo = accountNo.Replace(@"\"", "");
我遇到语法错误并且我的程序崩溃了。现在我知道除非您使用双引号,否则 Excel 不会显示引号,并且由于 CSV 文件就像文本文件,C# 的 StreamReader 只是读取带有引号的文件作为值,然后将其包装在另一组引号中默认因为那个变量是一个字符串。
有没有一种可靠的方法可以去掉反斜杠和多余的引号?我想过也许可以使用正则表达式,但我根本不知道正则表达式......
谢谢!
【问题讨论】:
-
我强烈建议使用流行的 CSV 库之一,例如 nuget.org/packages/CsvHelper,因为 CSV 格式存在一些复杂性,例如引用逗号和转义引号。
-
CSV 文件可能没问题,而您自己的代码根本无法正确处理文件中使用的转义。你可以解决这个问题,但如果没有 minimal reproducible example 显示你的实现,你将无法获得帮助。但无论如何你都不应该打扰......只需使用现有的 CSV API。查看标记的重复选项以获取大量选项。
-
如果你用@标记一个字符串,你需要使用双引号而不是用反斜杠转义它。在您的情况下,它应该看起来像这样:
@""""或像这样:"\"" -
@PeterDuniho 不幸的是,你和埃里克都提到的对我来说不是一个选择。不管我尝试使用 CSV 或 Excel 库之一,但总是遇到问题。如果我们讨论该主题,您是否有任何好的资源可以帮助在 Excel 和 CSV 文件上使用 C#?
-
“你和埃里克都提到的对我来说不是一个选择”——那么你需要修复你的代码。但是您无法使用您在此处提供的帖子获得帮助。您需要发布一个更具体的问题,其中包含一个minimal reproducible example,它准确显示了您如何解析 CSV,以及哪些数据没有被正确处理。 FWIW,到目前为止发布的三个答案中的每一个都是黑客攻击。没有涉及实际处理的字符转义;他们只是围绕您可能正在处理的特定数据进行混搭。
标签: c# string csv replace streamreader