2016-05-22 6 views
0

Ich benutze CsvHelper in C#. Ich möchte meine ORIGTITLE-Spalte nach bestimmten Werten filtern und diese in der Dictionary-Auflistung speichern. Also sollte ich in meiner Wörterbuchsammlung die folgenden Werte haben. Wie kann ich das erreichen?CsvHelper wie man eine Spalte filtert und nur bestimmte Werte zurückgibt

[Abbrechen, Ab] [abgleichen, translate1] [Abgrenzung, Something] [Baum, Baum]

Meine CSV-Datei sieht wie folgt aus:

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

Hier Mein bisheriger C# -Code:

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 
      } 
     } 
    } 

Antwort

1

Überprüfen Sie, ob der Schlüssel vorhanden ist, bevor Sie i hinzufügen t:

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

Dies wird nicht sehr gut für große Datensätze. Erwägen Sie die Verwendung von LINQ, um stattdessen eindeutige Werte zu erhalten.

+0

Dank für die schnelle Hilfe. Ich habe versucht, LINQ Distinct() zu records.Distinct() hinzuzufügen, aber es hat nicht funktioniert. – Devid

+1

Für Distinct() müssen Sie 'GetHashcode()' und 'Equals' für einen neuen Typ implementieren, den Sie für das Mapping verwenden sollten. Sie müssten Ihre komplette Logik neu aufbauen, um eine bessere Leistung zu erhalten, – sprinter252

1

können Sie LINQ verwenden, um die Aufzeichnungen von ORIGTITLE Eigenschaft Gruppe und anschließend Projekt zu einem Wörterbuch ORIGTITLE als Wörterbuch-Taste und die ersten REPLACETITLE in jeder Gruppe als Wörterbuch Wert unter:

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

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

Das sieht kompakt aus. Ich werde diese Antwort studieren. Danke – Devid

+0

Die letzte Idee ist, dass der Schlüssel ORIGTITLE sein sollte und der Wert sollte REPLACETITLE sein (wenn verfügbar), sonst ORIGTOOLTIP (falls verfügbar), sonst ORIGTITLE. – Devid

1

können Sie meine CSV verwenden Leser, der Ergebnisse in eine Datentabelle bringt. Sie können dann Linq verwenden, um unterschiedliche Werte zu erhalten.

Sie können einen Wörterbuch mit Code wie diese

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()); 

hier ist die Klasse für eine Formularanwendung

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; 
     } 
    } 
} 
Verwandte Themen