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
我没有尝试过很多行,但这是我的第一种方法:
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);
}
}
}
我不是第一个遇到这个问题的人,但在 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
我没有尝试过很多行,但这是我的第一种方法:
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);
}
}
}