如何从.csv文件中删除引号?

时间:2014-01-31 17:03:55

标签: c# list file replace

我在.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);
}

如何删除每行中的引号?

8 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

一种方法是使用Regex,考虑这种模式:

\"

Regular expression visualization

Debuggex Demo

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

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

此处input将是整个文件,甚至只是一行,模式为\"s将在删除后生成string双引号。

答案 2 :(得分:1)

它不起作用的原因在于:

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

考虑一下item将要包含哪种数据,因为您似乎正在检查char是否等于&quot,这是正确的做,但也许item不是char?想一想List<string> listItems = listLine.Split(';').ToList();foreach(String item in listItems正在做什么:)

答案 3 :(得分:0)

 foreach(String item in listItems)
 {
     if (item == "\"")
     {
          item2 = item.Replace("\"", "");
     }
     else
     {
          item2 = item;
     }
 }

答案 4 :(得分:0)

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

替换

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

代替item.Replace("\"", "")

答案 5 :(得分:0)

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

我相信你想要chr(34)

答案 6 :(得分:0)

一些LINQ怎么样?

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

答案 7 :(得分:0)

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

        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);
    }