【问题标题】:Reading from a .CSV file in C# returns an unwanted backslash, how do I get rid of it? [duplicate]从 C# 中的 .CSV 文件读取会返回不需要的反斜杠,我该如何摆脱它? [复制]
【发布时间】: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


【解决方案1】:

你试过accountNo = accountNo.Replace("\"", "");吗?

或者使用Trim()方法,比如accountNo = accountNo.Trim('"')

【讨论】:

  • Trim 为我解决了这个问题。实际上,我在发布后几分钟就尝试了它并且它有效,但我觉得回答自己的问题很愚蠢。我知道相同的结果有不同的方法,其他人也提到过。谢谢!
【解决方案2】:

下面的正则表达式应该可以完成这项工作

string accountNo = Regex.Match(yourString, @"\d+").Value;

然后你可以把它解析为int

try
{
    int m = Int32.Parse(accountNo);
}
catch (FormatException e)
{
    Console.WriteLine(e.Message);
}

【讨论】:

  • 请首选int.TryParse 而不是int.Parse + 显式try-catch 块。
  • @PeterCsala 我打算使用 TryParse,只是为了验证该值是否存在实际数字,而不是空无。
【解决方案3】:

与其尝试用空引号替换,不如尝试使用string.Empty 替换。

// a = ""1111""
string a = ("\"\"1111\"\"");

// b = 1111
string b = a.Replace("\"", string.Empty);

// c = 1111 but as an int
int c = int.Parse(b);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多