Linq для добавления отсутствующих элементов из одного списка строк в другой список

#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. Я до сих пор не понимаю, как это связано с тем, что делает код или комментарий — как они могут быть уже ожидаемыми?