c# - 正则表达式以正确的顺序替换日期
问题描述
因此,我需要修复一个文件,其中日期格式为 mm/dd/yyyy,并且 SSIS 包处理它所需的日期格式为 mmddyyyy(所以 03/11/2020 到 03112020)。然后 SSIS 有一个组件将字符串转换为 SQL 理解的 mm-dd-yyyy(我没有设计包,我只需要按原样使用它)
该文件是一个 CSV 文件,由 SSIS 加载到 SQL 服务器数据库中。
要修复文件,我想使用正则表达式
private static readonly string basePath = @"C:\Desktop\errorfiles\";
private static readonly Regex dateMatcher = new Regex(@"(\d{2}\/\d{2}\/\d{4})");
static void Main(string[] args)
{
string[] paths = {
"file1.csv",
"file2.csv",
"file3.csv"
};
foreach(string path in paths)
{
using (var sr = new StreamReader(basePath + path))
using (var sw = new StreamWriter(basePath + @"final\" + path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
var matches = dateMatcher.Matches(line);
foreach (Match match in matches)
{
var dateParts = match.Value.Split('/');
string dateStr = String.Empty;
foreach (string part in dateParts)
{
dateStr += part;
}
line = dateMatcher.Replace(line, dateStr, 1, match.Index);
}
sw.WriteLine(line);
}
}
}
}
我的第一次尝试是 with dateMatcher.Replace(line, dateStr)
,它看起来还不错,直到我在新文件中更仔细地检查并发现与原始文件相比日期不正确。所以我尝试了这条路线,它只在找到匹配的地方替换,这带来了另一个问题。在日期相同的情况下,它只会在一个地方替换它。
例如:
姓名,从服务日期,到服务日期,出生日期
鲍勃,03/11/2020,03/11/2020,07/02/1987
会成为
鲍勃,03112020,03/11/2020,07021987
但是我希望两者都成为03112020
,如果我将count
参数更改dateMatcher.Replace
为-1
它会替换行上的每个日期,例如:
鲍勃,03112020,03112020,03112020
这也是错误的,因为出生日期列改变了值,这是不希望的。
有没有办法专门替换与正则表达式匹配的每个日期,只在它出现的地方,并在有相同日期的值的地方替换?很抱歉,如果这听起来令人困惑,那么提出问题并不容易。
解决方案
只需使用
string line = "bob,03/11/2020,03/11/2020,07/02/1987";
Regex dateMatcher = new Regex(@"(\d{2})/(\d{2})/(\d{4})");
var newLine = dateMatcher.Replace(line,"$1$2$3");
输出:
bob,03112020,03112020,07021987
说明:搜索模式是将日期的每个部分存储在一个组中,从 1 到 3。然后,替换字符串仅采用这些组
推荐阅读
- javascript - 如何在不向每个图像写入特定请求的情况下获取十几个图像?
- python - 如何让 tkinter 在 IDLE 之外工作?
- python - 平均温度
- amazon-web-services - 如何将我的 AWS 服务目录旧版本重定向到新版本
- node.js - 复杂的nodejs路由
- .net - 确定哪个应用程序正在调用 DLL
- javascript - 处理多个复选框和复杂的数据结构(reactjs)
- javascript - 浏览器如何在所有网页上发现用户名和密码?
- php - PDO Inert Into On Duplicate Key 条件不工作
- python - 从长列表 Python 读取时出现 NoneType 错误