Задача сценария SSIS C #: как сопоставить / заменить шаблон с приращением в большом XML-файле - PullRequest
0 голосов
/ 25 октября 2018

Существуют и другие подобные вопросы, на которые были заданы и даны ответы, но ни один из этих ответов не работает в том, что я пытаюсь сделать, или мне не хватает информации, чтобы понять, как реализовать это в своем собственном коде.Я занимался этим два дня и теперь должен обратиться за помощью.

У меня есть задача сценария в пакете служб SSIS, где мне нужно выполнить сопоставление и заменить большой XML-файл, содержащий тысячи записей.Идентификационные метки.Каждый содержит номер.Мне нужно, чтобы эти числа были последовательными и увеличивались на единицу.Например, в файле XML я могу найти теги, которые выглядят так:

<ns1:recordIdentifier>1</ns1:recordIdentifier>
<ns1:recordIdentifier>6</ns1:recordIdentifier>
<ns1:recordIdentifier>223</ns1:recordIdentifier>
<ns1:recordIdentifier>4102</ns1:recordIdentifier> 

Мне нужно найти и заменить эти теги последовательными приращениями, например, так:

<ns1:recordIdentifier>1</ns1:recordIdentifier>
<ns1:recordIdentifier>2</ns1:recordIdentifier>
<ns1:recordIdentifier>3</ns1:recordIdentifier>
<ns1:recordIdentifier>4</ns1:recordIdentifier> 

Код, который у меня есть, приводит к тому, что все числа равны «1» без увеличения.

Я пробовал десятки различных методов, но пока ничего не помогло.

Любые идеиотносительно того, как я могу изменить приведенный ниже код для увеличения по желанию?

public void Main()
{            
string varStart = "<ns1:recordIdentifier>";
string varEnd = "</ns1:recordIdentifier>";
int i = 1;
string path = Dts.Variables["User::xmlFilename"].Value.ToString();
string outPath = Dts.Variables["User::xmlOutputFile"].Value.ToString();
string ptrn = @"<ns1:recordIdentifier>\d{1,4}<\/ns1:recordIdentifier>";
string replace = varStart + i + varEnd;

using (StreamReader sr = File.OpenText(path))
{
 string s = "";
 while ((s = sr.ReadLine()) != null && i>0)
{
 File.WriteAllText(outPath, Regex.Replace(File.ReadAllText(path),
 ptrn, replace));
 i++;
}

}

}

1 Ответ

0 голосов
/ 25 октября 2018

Вы были на правильном пути с методом Replace, но вам нужно будет использовать параметр MatchEvaluater при увеличении.

string inputFile = Dts.Variables["User::xmlFilename"].Value.ToString();
string outPutfile = Dts.Variables["User::xmlOutputFile"].Value.ToString();
string fileText = File.ReadAllText(inputFile);

//get any number between elements
Regex reg = new Regex("<ns1:recordIdentifier>[0-9]</ns1:recordIdentifier>");

string xmlStartTag = "<ns1:recordIdentifier>";
string xmlEndTag = "</ns1:recordIdentifier>";

//assuming this starts at 1
int incrementInt = 1;

fileText = reg.Replace(fileText, tag =>
                   { return xmlStartTag + incrementInt++.ToString() + xmlEndTag; });

File.WriteAllText(outPutfile, fileText);
...