#string #list #linq #csv #reporting-services
#строка #Список #linq #csv #службы отчетов
Вопрос:
У меня есть метод, который находит отсутствующие данные с известным шаблоном в реальном файле CSV, созданном службами отчетов SQL Server (SSRS), а затем добавляет эти отсутствующие данные в ожидаемый файл для последующего сравнения. Я знаю, что это не идеально, но данные с шаблоном были заархивированы из моей исходной базы данных, которую я использую для создания ожидаемого файла CSV для сравнения с моей отчетной базой данных, данные которой не были заархивированы. Только данные с этим шаблоном будут отсутствовать / архивироваться в моем ожидаемом файле.
Приведенный ниже метод работает и создает новый объединенный ожидаемый файл со всеми недостающими данными из фактического файла в правильном положении, и все исходные данные также присутствуют и перемещаются в новые позиции, чтобы соответствовать недостающим данным.
В любом случае, я пытаюсь практиковать методы Linq и задаюсь вопросом, как я мог бы заменить цикл «for» в моей логике. Я попытался выполнить where после выбора, но, похоже, не совсем правильно понял логику / синтаксис.
Любая помощь в этом будет оценена.
public static byte[] GetExpectedReportDataWithMissingActualData(
byte[] expectedReportData)
{
if (expectedReportData == null) { return expectedReportData; }
var _expectedReportDataLines = File.ReadAllLines(@"D:tempExpectedReport.csv");
var _actualReportDataLines = File.ReadAllLines(@"D:tempActualReport.csv");
// Identify the lines from the actual that contain "missing_pattern"
var _actualReportDataMissingRows = _actualReportDataLines.Where(reportLine => reportLine.Contains("missing_pattern"));
// There is no missing pattern data in the actual, simply return the expected as is
if (_actualReportDataMissingRows.Count() == 0) { return expectedReportData; }
var _expectedReportDataWithMergedMissingRows = new List<string>();
var _missingRowsAdded = 0;
for (var _counter = 0; _counter < _actualReportDataLines.Length; _counter )
{
// Check does the current row in the actual contain the string "missing_pattern"
if (_actualReportDataMissingRows.Contains(_actualReportDataLines[_counter]))
{
// Ensure that these records are not in the expected already
if (_expectedReportDataLines[_counter - _missingRowsAdded] != _actualReportDataLines[_counter])
{
_expectedReportDataWithMergedMissingRows.Insert(_counter, _actualReportDataLines[_counter]);
_missingRowsAdded ;
continue;
}
}
_expectedReportDataWithMergedMissingRows.Add(_expectedReportDataLines[_counter - _missingRowsAdded]);
}
return _expectedReportDataWithMergedMissingRows.Select(
reportLine => reportLine Environment.NewLine).SelectMany(reportLine => Encoding.UTF8.GetBytes(reportLine)).ToArray();
}
Я добавил сюда файлы примеров, как и было запрошено, чтобы, надеюсь, прояснить сценарий.
Ожидаемый отчет.csv
Line1Item1,Line1Item2,Line1Item3
Line2Item1,Line2Item2,Line2Item3
ActualReport.csv
Line1Item1,Line1Item2,Line1Item3
Line2Item1,missing_pattern,Line2Item3
Line3Item1,Line3Item2,Line3Item3
Возвращенные строки перед преобразованием в байтовый массив
Line1Item1,Line1Item2,Line1Item3
Line2Item1,missing_pattern,Line2Item3
Line3Item1,Line3Item2,Line3Item3
Строка 1 взята из ExpectedReport.csv
Строка 2 взята из ActualReport.csv
Строка 3 взята из ExpectedReport.csv
Комментарии:
1. Можете ли вы предоставить некоторые примеры ввода и вывода? Когда я пытаюсь запустить тестовые данные через вашу функцию, она не выполняет то, что я ожидаю от вашего описания.
2. Сложно предоставить входные и выходные данные, поскольку тип данных — массив байтов. У меня работает преобразование массива байтов, и я пытаюсь решить синтаксис linq в цикле for. Материал массива байтов может быть удален, если это облегчает понимание. Я добавил содержимое файлов примеров в свой вопрос, чтобы помочь вам понять концепцию.
3. Ваш код, похоже, делает намного больше, чем подразумевает ваш пример «убедитесь, что эти записи уже не ожидаются» — для чего это?
4. Если вы берете первую строку в ActualReport.csv
Line1Item1,Line1Item2,Line1Item3
, при создании новой объединенной версии файла в переменной_expectedReportDataWithMergedMissingRows
мы хотим использовать строку из ExpectedReport.csv , выполнив_expectedReportDataWithMergedMissingRows.Add(_expectedReportDataLines[_counter - _missingRowsAdded]);
вместо того, чтобы брать ее из ActualReport.csv, выполнив_expectedReportDataWithMergedMissingRows.Insert(_counter, _actualReportDataLines[_counter]);
5. Я до сих пор не понимаю, как это связано с тем, что делает код или комментарий — как они могут быть уже ожидаемыми?