2016-05-22 1 views
0

Я использую CsvHelper в C#. Я хочу отфильтровать столбец ORIGTITLE для различных значений и сохранить их в коллекции Dictionary. Поэтому в моей коллекции Dictionary я должен иметь значения ниже. Как я могу это сделать?CsvHelper как фильтровать столбец и возвращать только отдельные значения

[Abbrechen, Ab] [Abgleichen, translate1] [Abgrenzung, то] [Дерево, Baum]

Мой файл .csv выглядит следующим образом:

ORIGTITLE;REPLACETITLE;ORIGTOOLTIP 
Abbrechen;Ab;Abbrechen 
Abbrechen;Abort;abgelaufen 
Abgleich;translate1; 
Abgrenzung;Something;Abgrenzung zum Konto 
Tree;Baum;Baum 
Tree;Leaf;Baum 

Вот мой код C# до сих пор:

class DataRecord 
{ 
    public string ORIGTITLE { get; set; } 
    public string REPLACETITLE { get; set; } 
    public string ORIGTOOLTIP { get; set; } 
} 

public void CsvReader() 
    { 
     using (StreamReader streamReader = new StreamReader(@"C:\Users\Devid\Desktop\Newtest.txt")) 
     { 
      CsvReader reader = new CsvReader(streamReader); 
      reader.Configuration.Encoding = Encoding.UTF8; 
      reader.Configuration.Delimiter = ";"; 
      List<DataRecord> records = reader.GetRecords<DataRecord>().ToList(); 

      //records has to be a distinct list 

      Dictionary<string, string> dict = new Dictionary<string, string>(); 

      foreach (DataRecord record in records) 
      { 
       dict.Add(record.ORIGTITLE, record.REPLACETITLE); 
       //i get a error because the key is not distinctq 
      } 
     } 
    } 

ответ

1

Проверьте, существует ли ключ перед добавлением i t:

if (!dict.ContainsKey(record.ORIGTITLE)) 
{ 
    dict.Add(record.ORIGTITLE, record.REPLACETITLE); 
} 

Это не очень хорошо подходит для больших наборов данных. Вместо этого используйте LINQ для получения различных значений.

+0

благодарит за быструю помощь. Я попытался добавить LINQ Distinct() в records.Distinct(), но это не сработало. – Devid

+1

Для Distinct() вам нужно реализовать 'GetHashcode()' и 'Equals' новый тип, который вы должны использовать для сопоставления. Вам нужно будет перестроить свою полную логику, чтобы получить лучшую производительность, – sprinter252

1

Вы можете использовать LINQ для группы записей по ORIGTITLE собственности, а затем проект словаря, принимая ORIGTITLE в качестве словаря ключ и первый REPLACETITLE в каждой группе в качестве значения словаря:

List<DataRecord> records = reader.GetRecords<DataRecord>().ToList(); 

var dict = records.GroupBy(r => r.ORIGTITLE) 
        .ToDictionary(k => k.Key, v => v.First(). REPLACETITLE); 
+0

Это выглядит компактно. Я изучу этот ответ. Спасибо – Devid

+0

Последняя идея заключается в том, что ключ должен быть ORIGTITLE, а значение должно быть REPLACETITLE (если доступно) иначе ORIGTOOLTIP (если доступно) иначе ORIGTITLE. – Devid

1

Вы можете использовать свой CSV читатель, который выводит результаты в данные. Затем вы можете использовать Linq для получения отдельных значений.

Вы можете получить словарь с кодом, как этот

CSVReader reader = new CSVReader(); 
DataTable dt = reader.ReadCSVFile("filename", true).Tables[0]; 
Dictionary<int, List<DataRow>> dict = dt.AsEnumerable() 
    .GroupBy(x => x.Field<int>(0), y => y) 
    .ToDictionary(x => x.Key, y => y.ToList()); 

здесь класс для применения формы

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Data.OleDb; 
using System.Xml; 
using System.Xml.Xsl; 

namespace CSVImporter 
{ 

    public partial class CSVImporter : Form 
    { 
     //const string xmlfilename = @"C:\Users\fenwky\XmlDoc.xml"; 
     const string xmlfilename = @"C:\temp\test.xml"; 
     DataSet ds = null; 
     public CSVImporter() 
     { 
      InitializeComponent(); 
      // Create a Open File Dialog Object. 
      openFileDialog1.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*"; 
      openFileDialog1.ShowDialog(); 
      string fileName = openFileDialog1.FileName; 


      //doc.InsertBefore(xDeclare, root); 
      // Create a CSV Reader object. 
      CSVReader reader = new CSVReader(); 

      ds = reader.ReadCSVFile(fileName, true); 
      dataGridView1.DataSource = ds.Tables["Table1"]; 

     } 
     private void WXML_Click(object sender, EventArgs e) 
     { 
      WriteXML(); 

     } 
     public void WriteXML() 
     { 

      StringWriter stringWriter = new StringWriter(); 
      ds.WriteXml(new XmlTextWriter(stringWriter), XmlWriteMode.WriteSchema); 

      string xmlStr = stringWriter.ToString(); 

      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xmlStr); 


      XmlDeclaration xDeclare = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
      XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 

      doc.InsertBefore(xDeclare, doc.FirstChild); 

      // Create a procesing instruction. 
      //XmlProcessingInstruction newPI; 
      //String PItext = "<abc:stylesheet xmlns:abc=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">"; 
      //String PItext = "type='text/xsl' href='book.xsl'"; 
      string PItext = "html xsl:version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\""; 
      XmlText newPI = doc.CreateTextNode(PItext); 
      //newPI = docCreateProcessingInstruction("html", PItext); 
      //newPI = doc.CreateComment(CreateDocumentType("html", PItext, "", ""); 
      doc.InsertAfter(newPI, doc.FirstChild); 
      doc.Save(xmlfilename); 

      XslCompiledTransform myXslTrans = new XslCompiledTransform(); 
      myXslTrans.Load(xmlfilename); 
      string directoryPath = Path.GetDirectoryName(xmlfilename); 
      myXslTrans.Transform(xmlfilename, directoryPath + "result.html"); 
      webBrowser1.Navigate(directoryPath + "result.html"); 

     } 
    } 

    public class CSVReader 
    { 

     public DataSet ReadCSVFile(string fullPath, bool headerRow) 
     { 

      string path = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1); 
      string filename = fullPath.Substring(fullPath.LastIndexOf("\\") + 1); 
      DataSet ds = new DataSet(); 

      try 
      { 
       if (File.Exists(fullPath)) 
       { 
        string ConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" + ";Extended Properties=\"Text;HDR={1};FMT=Delimited\\\"", path, headerRow ? "Yes" : "No"); 
        string SQL = string.Format("SELECT * FROM {0}", filename); 
        OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, ConStr); 
        adapter.Fill(ds, "TextFile"); 
        ds.Tables[0].TableName = "Table1"; 
       } 
       foreach (DataColumn col in ds.Tables["Table1"].Columns) 
       { 
        col.ColumnName = col.ColumnName.Replace(" ", "_"); 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      return ds; 
     } 
    } 
} 
Смежные вопросы