2013-12-06 3 views
1

В C# должно быть выполнено все следующее. Разбор таблицы SQL (SQL Server) будет выполнен с использованием методов в System.Data.Odbc.Чтение из файлов и разбор таблицы SQL

Предположим, у меня есть два CSV-файла, fi1 и fi2. Первый файл csv имеет два столбца id и val1, а второй csv также имеет два столбца: id и val2.

Я хотел бы прочитать эти два файла и проанализировать вывод в одной таблице SQL со следующими столбцами: id, val1, val2.

Проблема заключается в том, что оба файла может иметь различные записи в id столбцах: других словах, некоторые идентификаторы могут иметь значение val1 но не val2 значения, и наоборот, или они могут иметь оба значения.

Таблица должна содержать объединение столбцов id в двух файлах.

Пример:

Файл 1

enter image description here

File2

enter image description here

Как я хотел бы, чтобы окончательный SQL таблицы, чтобы выглядеть так:

enter image description here

Обратите внимание, что каждый файл может содержать дубликаты, и мы хотели бы, чтобы исключить дубликаты при анализе таблицы SQL.

мысль у меня была заключается в создании двух словарей, dict1 и dict2, где ключ оказался бы id, а значение будет val1 и val2. Словари будет использоваться, чтобы убедиться, что дубликаты не включены:

Dictionary<string, string> dict1 = new Dictionary<string, string>(); 
string[] header1 = new string[]{}; 

using (StreamReader rdr = new StreamReader(fi1)) 
{ 
    header1 = rdr.ReadLine().Split(','); 
    while (!rdr.EndOfStream) 
    { 
      string ln = rdr.ReadLine(); 
      string[] split_ln = ln.Split(','); 
      dict1.Add(split_ln[0], split_ln[1]); 
    } 
} 

Dictionary<string, string> dict2 = new Dictionary<string, string>(); 
string[] header2 = new string[]{}; 

using (StreamReader rdr = new StreamReader(fi2)) 
{ 
    header2 = rdr.ReadLine().Split(','); 
    while (!rdr.EndOfStream) 
    { 
      string ln = rdr.ReadLine(); 
      string[] split_ln = ln.Split(','); 
      dict2.Add(split_ln[0], split_ln[1]); 
    } 
} 

Однако после добавления каждого файла словаря, я не знаю, как соответствовать идентификаторы обоих словарей.

У кого-нибудь есть хороший намек относительно того, как справиться с этой проблемой?

+0

Почему кто-нибудь голосует, чтобы закрыть этот пост? Он имеет как воспроизводимый пример, так и показывает, что я пробовал. Я не уверен, в чем проблема. – Mayou

+0

Вы можете использовать linq –

+0

Не совсем, я никогда не использовал Кортеж. Не могли бы вы рассказать мне, как вы предлагаете использовать его? Благодаря! – Mayou

ответ

1

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

var dict = new List<Tuple<string, string, string>>(); 
     using (StreamReader rdr = new StreamReader(fi1)) 
     { 
      while (!rdr.EndOfStream) 
      { 
       string ln = rdr.ReadLine(); 
       string[] split_ln = ln.Split(','); 
       dict.Add(new Tuple<string, string, string>(split_ln[0], split_ln[1],null)); 
      } 
     } 
     using (StreamReader rdr = new StreamReader(fi2)) 
     { 
      while (!rdr.EndOfStream) 
      { 
       string ln = rdr.ReadLine(); 
       string[] split_ln = ln.Split(','); 
       if (dict.Any(item => item.Item1 == split_ln[0])) 
       { 
        var item = dict.Find(i => i.Item1 == split_ln[0]); 
        var newtuple = new Tuple<string, string, string>(item.Item1, item.Item2, split_ln[1]); 
        dict.Remove(item); 
        dict.Add(newtuple); 
       } 
       else 
       { 
        dict.Add(new Tuple<string, string, string>(split_ln[0],null,split_ln[1])); 
       } 
      } 
     } 
+0

Звучит очень просто и здорово! Однако можно ли добавить элемент в кортеж, который имеет только val1 (в файле1) и не имеет значения val2 в файле2? – Mayou

+0

он действительно делает это, все значения в файле один добавляются в список, а затем, когда считывается файл два, он проверяет элементы, добавленные из файла 1, и обновляет их, если это необходимо, но оставит те, у которых нет файла 2 эквивалент один – theDarse

+0

Отлично, я посмотрю! Благодаря! – Mayou

Смежные вопросы