2016-07-15 4 views
-1

Предположим, у меня есть CSV-файл, который содержит следующее:Csv колонны и отображение их

Column1,Column2,Column3 
Supermario,1989,Nintendo 

Однако я хочу, чтобы статически определить действительные заголовки столбцов, такие как:

Game_Name,Year,Console_Name 

Я хотел бы, чтобы пользователю отображать заголовки в CSV-файл для статических действительных заголовков так:

Column1 ---- Game_Name 
Column2 ---- Year 
Column3 ----- Console_Name 

У меня возникли проблемы п как я мог выполнить эту задачу.

Я использовал csvhelper, прежде чем читать csv-файлы, но здесь я хочу, чтобы пользователь мог определить свои собственные заголовки столбцов, и когда мое приложение формы запускается, я хочу сопоставить их с допустимыми заголовками столбцов.

В следующем разделе в сниппет, что Джефф отметил:

public MyDataClassMap() 
    { 
     Map(x => x.GameName).Name("Column1"); 
     Map(x => x.Year).Name("Column2"); 
     Map(x => x.ConsoleName).Name("Column3"); 
    } 

Вот это выглядит как «COLUMN1», а остальные из них в настоящее время отображаются вручную не динамически ... Я не знаю, что в столбцы будут названы так, как это будет работать? Если столбцы всегда назывались Column1, Column2 и т. Д. И т. Д., Это могло бы работать, но иногда его Column1 иногда его Col1 иногда его C1 произвольно.

Что такое возможное решение?

Спасибо,

+0

почему не использовать заголовок столбца в первой строке, а не с помощью COLUMN1, COLUMN2, колонка3? – Mark

+0

Я не создаю файл, который кто-то еще создает файл csv, и я не контролирую его. Я бы хотел, чтобы конечный пользователь мог сопоставить его сами – RobertC

ответ

0

Использование CsvHelper, создать карту класса для типа данных, зарегистрировать его, а затем прочитать его.

class MyData 
{ 
    public string GameName { get; set; } 
    public string Year { get; set; } 
    public string ConsoleName { get; set; } 
} 

class MyDataClassMap : CsvClassMap<MyData> 
{ 
    public MyDataClassMap() 
    { 
     Map(x => x.GameName).Name("Column1"); 
     Map(x => x.Year).Name("Column2"); 
     Map(x => x.ConsoleName).Name("Column3"); 
    } 
} 
public List<MyData> ReadMyData(string path) 
{ 
    using (var file = File.OpenText(path)) 
    using (var reader = new CsvReader(file)) 
    { 
     reader.Configuration.RegisterClassMap<MyDataClassMap>(); 
     return reader.GetRecords<MyData>().ToList(); 
    } 
} 

Если вы знаете имена заголовков может измениться, но порядок столбцов невозможен, вы можете сопоставить их по индексу.

public MyDataClassMap() 
{ 
    Map(x => x.GameName).Index(0); 
    Map(x => x.Year).Index(1); 
    Map(x => x.ConsoleName).Index(2); 
} 

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

public MyDataClassMap(string gameNameCol, string yearCol, string consoleNameCol) 
{ 
    Map(x => x.GameName).Name(gameNameCol); 
    Map(x => x.Year).Name(yearCol); 
    Map(x => x.ConsoleName).Name(consoleNameCol); 
} 
public List<MyData> ReadMyData(string path, 
     string gameNameCol, string yearCol, string consoleNameCol) 
{ 
    using (var file = File.OpenText(path)) 
    using (var reader = new CsvReader(file)) 
    { 
     reader.Configuration.RegisterClassMap(
      new MyDataClassMap(gameNameCol, yearCol, consoleNameCol)); 
     return reader.GetRecords<MyData>().ToList(); 
    } 
} 
+0

гипотетически, если бы я создал другую запись в MyDataClassMap(), называемую M (x => x.Publisher) .Name ("Column4"); будет ли id выдавать исключение, если этот столбец не был в моем файле csv? как я мог это исправить? или существует обходной путь для такого сценария – RobertC

+0

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

+0

Привет, Джефф, это здорово, я думаю, что это определенно будет ответом, который я ищу, за исключением мелких деталей, которые из фрагмента выше его не выглядят динамичными, похоже, что я все еще сопоставляю Column1, Column2 и т. Д. И т. Д. . Статически я не вижу, как я буду передавать заголовки переменных, которые позволят мне делать это динамически. – RobertC

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