【问题标题】:How do I remove the quotation marks from a .csv file?如何从 .csv 文件中删除引号?
【发布时间】:2014-02-24 11:42:46
【问题描述】:

我读入一个 .csv 文件。

内容如下:

1;"final60";"英国";"2013-12-06 15:48:16";

2;"donnyr8";"荷兰";"2013-12-06 15:54:32";等等

目前我只是尝试使用Replace 方法从每一行中删除引号。这是我尝试过的,似乎没有做任何事情。虽然无论如何似乎都没有破坏程序。

try
{
    string item2;
    List<string> list = File.ReadLines("file.csv").ToList();
    foreach (string listLine in list)
    {
         Console.Write("#  ");
         // seperate up this line into a new list by ; 
         List<string> listItems = listLine.Split(';').ToList();
         foreach(String item in listItems)
         {
              if (item == "&quot;")
              {
                    item2 = item.Replace("&quot;", "");
              }
              else
              {
                    item2 = item;
              }
              Console.Write(item2);
         }
         Console.WriteLine("\n");
    }
}
catch (Exception e)
{
    // Let the user know what went wrong.
    Console.WriteLine("The file could not be read:");
    Console.WriteLine(e.Message);
}

如何去掉每行的引号?

【问题讨论】:

  • 您正在寻找 7 个字符的 string &amp;quot; 是文件中的实际内容吗?它是一个 HTML 实体,在 C# 中没有任何意义,使用 "\"" 替换基本的双引号。

标签: c# list file replace


【解决方案1】:

使用一些现有的 CSVParser 而不是手动执行此操作要容易得多。 您可以使用例如:

手动解析 CSV 文件会带来很多潜在风险。即使您解决了上述挑战,您也不能确定不会有其他情况下您的 CSV 文件无法正确解析。

【讨论】:

  • 感谢您的参考,不过我对 C# 还是很陌生,现在正在努力掌握基础知识。
【解决方案2】:

一种方法是使用正则表达式,请考虑以下模式:

\"

Debuggex Demo

它将匹配字符串中的所有",因此您可以执行以下操作:

var s = Regex.Replace(input, pattern, string.Empty);

这里input 将是整个文件,甚至只是一行,模式将是\",s 将是删除这些双引号后生成的string。

【讨论】:

    【解决方案3】:
     foreach(String item in listItems)
     {
         if (item == "\"")
         {
              item2 = item.Replace("\"", "");
         }
         else
         {
              item2 = item;
         }
     }
    

    【讨论】:

    • 谢谢,虽然不完全相关。
    【解决方案4】:

    您是否尝试过替换 " 引号? item.Replace("&amp;quot;", ""); 没有做任何事情,因为没有出现子字符串 &amp;quot;。

    替换

    if (item == "&quot;")
    {
        item2 = item.Replace("&quot;", "");
    }
        else
    {
        item2 = item;
                                        }
    

    改为item.Replace("\"", "")。

    【讨论】:

      【解决方案5】:

      尝试查找并替换 chr 代码而不是转义序列。

      我相信你会想要 chr(34)

      【讨论】:

        【解决方案6】:

        一些 LINQ 怎么样?

        var lines = File.ReadLines("file.csv")
                        .Select(line => string.Join("", line.Select(c => c != '"')));
        

        【讨论】:

          【解决方案7】:

          它不起作用的原因在这里:

          List<string> listItems = listLine.Split(';').ToList();
          foreach(String item in listItems)
          {
              if (item == "&quot;") {
                  item2 = item.Replace("&quot;", "");
              }
          }
          

          想想item 将保存什么样的数据,因为您似乎正在检查char 是否等于&amp;quot,这是正确的做法,但也许@987654325 @ 不是字符吗?想想List&lt;string&gt; listItems = listLine.Split(';').ToList(); 和foreach(String item in listItems 在做什么:)

          【讨论】:

          • 我假设listItems 将是一个字符串(这显然是一个字符数组)。所以我使用foreach循环遍历字符串中的每个字符来检查其中是否有人是引号!?
          • 这就是你想要做的,是的。但是您不是遍历每个字符串中的每个字符,而是遍历 listItems 中的每个字符串。您希望单独查看每个字符,而现在您正在将整个字符串与单个字符进行比较。
          【解决方案8】:

          我们在输出这种格式的第 3 方库中遇到了同样的问题。当字段嵌入引号字符时,会发生一个棘手的部分。为避免这种情况,以下代码确保字段分隔符与其相邻(或行首/行尾)。如果字段分隔符嵌入在字段的开头或结尾,则此实现将。

                  private void FileStripDoubleQuotedFields(string csvPath, string fieldSeparator)
                  {
                      // Input file:  "asdf"   "bfdsa" "fdsa"
                      // Output file:  asdf   bfdsa   fdsa
          
                      string stripped = csvPath.Replace(".", "_stripped.");
                      using (StreamReader reader = new StreamReader(csvPath))
                      using (StreamWriter writer = new StreamWriter(stripped, true, reader.CurrentEncoding))
                      {
                          string line;
                          while ((line = reader.ReadLine()) != null)
                          {
                              string newLine = line
                                  .RegexReplace("^\"", "")        // begin of line
                                  .RegexReplace("\"" + fieldSeparator + "\"", fieldSeparator) // between fields
                                  .RegexReplace("\"" + fieldSeparator, fieldSeparator) // field followed by empty field(s)
                                  .RegexReplace(fieldSeparator + "\"", fieldSeparator) // empty field(s) followed by field
                                  .RegexReplace("\"$", "");       // ending quote
          
                              writer.WriteLine(newLine);
                          }
                      }
                      string orgPath = csvPath.Replace(".", "_spire.");
          
                      File.Move(csvPath, orgPath);
                      File.Move(stripped, csvPath);
          
                      File.Delete(orgPath); // breakpoint here to compare before the delete
                  }
          
              public static string RegexReplace(
                  this string input,
                  string pattern,
                  string replacement,
                  RegexOptions options = RegexOptions.None)
              {
                  return Regex.Replace(input, pattern, replacement, options);
              }
          

          【讨论】:

            猜你喜欢
            • 2022-01-20
            • 2014-05-05
            • 1970-01-01
            • 2021-12-16
            • 2016-05-10
            • 2018-07-27
            • 1970-01-01
            • 2021-02-22
            • 2019-07-08
            相关资源
            最近更新 更多