Regex заменяет даты в правильном порядке - PullRequest
0 голосов
/ 11 марта 2020

Поэтому мне нужно исправить файл, в котором даты были в формате мм / дд / гггг, а даты, необходимые для пакета служб SSIS для их обработки, в форме ммддйййй (с 03/11/2020 по 03112020 ). Затем в SSIS есть компонент, который превращает строку в mm-dd-гггг, который понимает SQL (я не проектировал пакет, мне просто нужно работать с ним как есть)

Файл является CSV-файл загружается службами SSIS в серверную базу данных SQL.

Чтобы исправить файл, я подумал использовать Regex

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

Моя первая попытка была с 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

Что также неверно, поскольку в столбце даты рождения изменяется значение, и это нежелательно.

Есть ли способ специально заменить каждую дату, соответствующую регулярному выражению, только в том месте, где она появляется, и также заменить там, где есть значения, совпадающие с этой датой? Прошу прощения, если это звучит запутанно, но не легко поставить вопрос.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Просто используйте

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. Затем выполняется замена строка принимает только те группы

0 голосов
/ 11 марта 2020

Один из вариантов - заменить косые черты между месяцем и днем ​​и днем ​​и годом пустыми строками. Следующее регулярное выражение может использоваться для сопоставления с этими косыми чертами:

(?<=\d{2})\/(?=\d{2}\/\d{4})|(?<=\d{2}\/\d{2})\/(?=\d{4})

Демо

Это регулярное выражение выполняет следующие совпадения.

(?<=\d{2})        # match two digits in a pos lookbehind
\/                # match '/'
(?=\d{2}\/\d{4})  # match 2 digits, '/', 4 digits in a pos lookahead
|                 # or
(?<=\d{2}\/\d{2}) # match 2 digits, '/', 2 digits in a pos lookbehind
\/                # match '/'
(?=\d{4})         match 4 digits in a pos lookahead
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...