首页 > 解决方案 > 正则表达式以正确的顺序替换日期

问题描述

因此,我需要修复一个文件,其中日期格式为 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

这也是错误的,因为出生日期列改变了值,这是不希望的。

有没有办法专门替换与正则表达式匹配的每个日期,只在它出现的地方,并在有相同日期的值的地方替换?很抱歉,如果这听起来令人困惑,那么提出问题并不容易。

标签: c#regex

解决方案


只需使用

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。然后,替换字符串仅采用这些组


推荐阅读