Заполните словарь (2) ключами, соответствующими словарю (1) - PullRequest
0 голосов
/ 25 мая 2018

Я нашел эту ссылку , однако мне не удалось преобразовать ее из добавления даты и времени в добавление пустых ключей int.


У меня есть 2 словаря.Я использую один в качестве строки «заголовка» для CSV, а второй для каждой строки «данных».

Идея состоит в том, что независимо от формата информации, я могу посмотреть на индекс (ключзначение) заголовка для соответствующей ячейки и поместите значение в соответствующее место.

Так, например, у файла A есть поле «Имя», а у файла B - поле «Возраст».Он сканирует файл A и добавляет 0, "Name" к headerDictionary, затем сканирует файл B и добавляет 1, "Age".

. Здесь начинается моя проблема:

Затем выполняется поискзначения каждого файла.Он находит значение «Name» в файле A, обращается к headerDictionary для получения ключа и добавляет 0, "Bob".Это тогда готово быть записанным в CSV.Он проходит тот же процесс для файла B и добавляет 1, "23" для записи в csv.

Моя проблема заключается в том, что если я заполню csv, используя эту информацию, мой csv все равно будет выглядеть так:

Name,Age
Bob
23

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

// Add empty entries to recordDictionary, based on the headerDictionary

// recordDictionary for File A:
 [0, "Bob"]
 [1, ""]

// recordDictionary for File B:
 [0, ""]
 [1, "23"]

Итак, мой CSV будет выглядеть так:

Name,Age
Bob,
,23

1 Ответ

0 голосов
/ 25 мая 2018

[Редактировать 4: Ответить на заглавный вопрос для будущих посетителей]

//after you've filled your record dictionary from file...
foreach(int i in headers.Keys) {
    if (!singleRecord.ContainsKey(i)) {
        singleRecord.Add(i, "");
    }
}

[Оригинал]

var headers = new SortedDictionary<int, string>();
//...populate headers dictionary
var singleRecord = new Dictionary<int, string>();
//...populate a record
var sb = new StringBuilder();

foreach(int i in headers.Keys) {
    sb.Append((singleRecord.ContainsKey(i) ? singleRecord[i] : "") + ",");
}

И либо удалить запятую, либо добавить ее только при необходимости.

[Правка 1] Хотя это отвечает на ваш конкретный вопрос, я думаю, что было бы проще просто сохранить заголовки в виде списка, а ключи в вашем словаре singleRecord были бы просто фактическими строками заголовка.

[Edit 2] И лично я бы предложил просто создать DataTable.Вы можете добавить дополнительные столбцы всякий раз, когда вы нажимаете новый заголовок в файле и просто добавляете пустую строку по умолчанию.Тогда я бы использовал крошечную функцию, которая преобразует любой DataTable в CSV.

[Изменить 3] Вот псевдокод (из обсуждения проблемы в чате)

create new DataTable
for each folder
    for each file
        create new DataRow
        for each label
            if data.Columns not yet with name label
                create new column, default value ""
            add value to row
        add row to DataTable
output DataTable as csv file, or string. //(build yourself a Utility to do this... it's a pretty common thing to want to do)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...