C# 正则表达式模式删除双引号分隔字符串中的逗号

C# Regex Pattern to remove comma inside double quote delimited string

我不是第一个遇到这个问题的人,但在 Stack 上搜索了几个小时后,我没有找到任何答案。我有一个在 csv 文件目录上工作的 SSIS 脚本。该脚本折叠、弯曲和毁坏这些文件;执行查询、数据清理、保留一些数据,最后将一小部分输出到 csv 文件,由另一个系统摄取。

其中一个文件有一个包含以下值的自由文本字段:“20,000 BONUS POINTS”。这一个字段,在一个10k行的文件中,几十个类似的文件之一,是我似乎无法解决的问题。

请注意:我在 C# 和 Regex 方面都很薄弱。

示例 csv 集:

4121,6383,0,,,TRUE
4122,6384,0,"20,000 BONUS POINTS",,TRUE
4123,6385,,,,
4124,6386,0,,,TRUE
4125,6387,0,,,TRUE
4126,6388,0,,,TRUE
4127,6389,0,,,TRUE
4128,6390,0,,,TRUE

我找到了很多关于如何使用各种正则表达式模式解析它的信息,但我注意到 StreamReader.ReadLine() 方法用双引号将整行括起来:

"4121,6383,0,,,TRUE"

这样正则表达式替换方法的输出:

s = Regex.Replace(line, @"[^\""]([^\""])*[^\""]",
m => m.Value.Replace(",", ""));

看起来像这样:

412163830TRUE

实际包含双引号分隔字符串的目标行最终看起来像:

"412263840\"20000 BONUS POINTS\"TRUE"

我的整个方法(为了您的阅读乐趣)是这样的:

        string fileDirectory = "C:\tmp\Unzip\";
        string fullPath = "C:\tmp\Unzip\test.csv";
        string line = "";
        //int count=0;
        List<string> list = new List<string>();

            try
        {
            //MessageBox.Show("inside Try Block");
            string s = null;
            StreamReader infile = new StreamReader(fullPath);
            StreamWriter outfile = new StreamWriter(Path.Combine(fileDirectory, "output.csv"));
            while ((line = infile.ReadLine()) != null)
            {
                //line.Substring(0,1).Substring(line.Length-1, 1);
                System.Console.WriteLine(line);
                Console.WriteLine(line);
                line = 
                s = Regex.Replace(line, @"[^\""]([^\""])*[^\""]",
                                        m => m.Value.Replace(",", ""));
                System.Console.WriteLine(s);
                list.Add(s);

            }
            foreach (string item in list)
            {
                outfile.WriteLine(item);
            };
            infile.Close();
            outfile.Close();
            //System.Console.WriteLine("There were {0} lines.", count);
        }

        catch (Exception e)
        {

            Console.WriteLine(e.Message);
        }

        //another addition for TFS consumption

    }

感谢阅读,如果您有一个有用的答案,祝福您和您的神童子孙后代!

mfc

编辑:要求是有效的 csv 文件输出。对于测试数据,它看起来像这样: 4121,6383,0,真
4122,6384,0,"20000 奖励积分",TRUE
4123,6385,
4124,6386,0,真
4125,6387,0,真
4126,6388,0,真
4127,6389,0,真
4128,6390,0,TRUE

我建议像其他人建议的那样使用 CSV reader 库。

Install-Package LumenWorksCsvReader

https://github.com/phatcher/CsvReader#getting-started

但是,如果您只是想尝试一些又快又脏的东西。试试这个。

如果我没理解错的话。您需要删除 CSV 文件每一行中双引号之间的逗号。这应该做到这一点。

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string pattern = @"([""'])(?:(?=(\?)).)*?";
        List<string> lines = new List<string>(); 
        lines.Add("4121,6383,0,,,TRUE");
        lines.Add("4122,6384,0,\"20,000 BONUS POINTS\",,TRUE");
        lines.Add("4123,6385,,,,");
        lines.Add("4124,6386,0,,,TRUE");
        lines.Add("4125,6387,0,,,TRUE");
        lines.Add("4126,6388,0,,,TRUE");
        lines.Add("4127,6389,0,,,TRUE");
        lines.Add("4128,6390,0,,,TRUE");

        StringBuilder sb = new StringBuilder();
        foreach (var line in lines)
        {
            sb.Append(Regex.Replace(line, pattern, m => m.Value.Replace(",", ""))+"\n");
        }           
        Console.WriteLine(sb.ToString());
    }
}

输出

4121,6383,0,,,TRUE
4122,6384,0,"20000 BONUS POINTS",,TRUE
4123,6385,,,,
4124,6386,0,,,TRUE
4125,6387,0,,,TRUE
4126,6388,0,,,TRUE
4127,6389,0,,,TRUE
4128,6390,0,,,TRUE

https://dotnetfiddle.net/flmWG3

我没有尝试过很多行,但这是我的第一种方法:

namespace ConsoleTestApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var before = "4122,6384,0,\"20,000 BONUS POINTS\",,TRUE";
            var pattern = @"""[^""]*""";
            var after = Regex.Replace(before, pattern, match => match.Value.Replace(",", ""));
            Console.WriteLine(after);
        }
    }
}