2011-06-01 15 views
9

मैं LINQ क्वेरी से परिणाम प्रकार के वर के रूप में IEnumerable<T>IEnumerable <T> एक CSV फ़ाइल

मैं एक CSV फ़ाइल LINQ

मैं से परिणाम हो रही है से परिणाम से बनाया जा करना चाहते हो रही है निम्न क्वेरी

var r = from table in myDataTable.AsEnumerable() 
     orderby table.Field<string>(para1) 
     group table by new { Name = table[para1], Y = table[para2] } 
     into ResultTable 
     select new 
     { 
      Name = ResultTable.Key, 
      Count = ResultTable.Count() 
     }; 
+0

टी किस प्रकार का है? –

+0

यह प्रश्न कुछ हद तक अस्पष्ट है, इसे "वास्तविक प्रश्न नहीं" के रूप में बंद करने के लिए पहले से ही 2 वोट हैं। कृपया http://tinyurl.com/so-hints देखें और देखें कि क्या आप प्रश्न को बेहतर बना सकते हैं। –

उत्तर

13

चेक इस

public static class LinqToCSV 
    { 
     public static string ToCsv<T>(this IEnumerable<T> items) 
      where T : class 
     { 
      var csvBuilder = new StringBuilder(); 
      var properties = typeof(T).GetProperties(); 
      foreach (T item in items) 
      { 
       string line = string.Join(",",properties.Select(p => p.GetValue(item, null).ToCsvValue()).ToArray()); 
       csvBuilder.AppendLine(line); 
      } 
      return csvBuilder.ToString(); 
     } 

     private static string ToCsvValue<T>(this T item) 
     { 
      if(item == null) return "\"\""; 

      if (item is string) 
      { 
       return string.Format("\"{0}\"", item.ToString().Replace("\"", "\\\"")); 
      } 
      double dummy; 
      if (double.TryParse(item.ToString(), out dummy)) 
      { 
       return string.Format("{0}", item); 
      } 
      return string.Format("\"{0}\"", item); 
     } 
    } 

पर पूर्ण कोड: Scott Hanselman's ComputerZen Blog - From Linq To CSV

+0

समाधान – usr021986

+0

@ScottHanselman के लिए धन्यवाद उस कोड में एक बग है। यह '/" 'का उपयोग करके तारों में उद्धरणों से बचने की कोशिश करता है। यह सही नहीं है। सीएसवी के लिए, उद्धरण डबल कोट्स का उपयोग करके बच निकले हैं। Https://en.wikipedia.org/wiki/Comma-separated_values ​​ – MgSam

5
IEnumerable<string> lines = r.Select(x => String.Format("{0},{1}", r.Name, r.Count)); 
System.IO.File.WriteAllLines(path, lines); 

होगा उत्पादन:

name1,count1 
name2,count2 
... 
+0

मुझे आपका अंक नहीं मिल रहा है। मैं IEnumrable usr021986

+0

@abatishchev के परिणाम से सीएसवी फ़ाइल बनाना चाहता हूं: यह काम नहीं करेगा: 'IENumerable ' को 'IENumerable ' में परिवर्तित नहीं किया जा सकता है। –

+0

@ डैनियल: निश्चित रूप से, यह एक टाइपो था, मेरा मतलब है 'आईनेमेरेबल ', लेकिन यदि ओपी 'आईन्यूमेरेबल ' चाहता है तो उसके सवाल को कोई समझ नहीं आता है। – abatishchev

0

मुझे लगता है कि आप अपने प्रश्न से मानते हैं कि आप जेनेरिक विधि है जो यह करेगा, चाहे टी क्या है?

कुछ

तरह
public void ToCSV<T>(IEnumerable<T>, TextWriter writer) . . . 
समस्या आप को दूर नहीं कर सकते हैं

, कि T, जटिल प्रकार है अल्पविराम को T के प्रत्येक तत्व आप T के आंतरिक भागों, या करने के लिए T जरूरतों के बारे में पता करने की जरूरत अलग है सीएसवी पंक्ति के रूप में इसे स्वयं लिखना है, जिसका अर्थ है कि आपको आईसीएसवीआरओ इंटरफेस की आवश्यकता होगी और आपको आईसीएसवीआरओ को लागू करने वाली वस्तुओं को टी को बाध्य करने की आवश्यकता होगी। जिसका अर्थ है कि यह अनाम प्रकारों के लिए काम नहीं करेगा।

कोई प्रश्न सिर्फ चिल्लाओ।

+0

हां, मैं टी – usr021986

+0

@ उपयोगकर्ता 373083 पर ध्यान दिए बिना सामान्य विधि चाहता हूं: फिर आपको गणना के प्रकार के गुणों को प्राप्त करने के लिए प्रतिबिंब का उपयोग करने की आवश्यकता होगी, यह कीड़े का एक प्रकार हो सकता है, आपको या तो बहुत कुछ होना चाहिए 'टीसीएसवी' टी के साथ क्या करेगा, इसके बारे में सख्त, या यह एक दुःस्वप्न में बदल जाएगा। क्या आप रेफरफेक्शन के साथ अच्छे हैं, या मुझे प्रारंभ_ कोड प्राप्त करने के लिए कुछ _how पोस्ट करना चाहिए? –

2

इसकी स्पष्ट नहीं क्या तुम सच में चाहते हैं, लेकिन यह एक समाधान सार्वजनिक शून्य पढ़ें() {

var r = from table in myDataTable.AsEnumerable() 
      orderby table.Field<string>(para1) 
      group table by new { Name = table[para1], Y = table[para2] } 
       into ResultTable 
       select new NameCount() 
       { 
        Name = ResultTable.Key, 
        Count = ResultTable.Count() 
       }.ToString(); 

    //Write all r to a File 
} 
public class NameCount 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
    public string ToString() 
    { 
     return string.Format("{0},{1}\r\n", Name, Count); 
    } 
} 
1
हो सकता है

यह एक मूल समाधान है जिसका उपयोग मैं किसी भी आईनेमरेबल के लिए कर रहा हूं:

using System.Reflection; 
using System.Text; 
//***   
    public void ToCSV<T>(IEnumerable<T> items, string filePath) 
    { 
     var dataTable = new DataTable(typeof(T).Name); 
     PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     foreach (var prop in props) 
      dataTable.Columns.Add(prop.Name, prop.PropertyType); 

     foreach (var item in items) 
     { 
      var values = new object[props.Length]; 
      for (var i = 0; i < props.Length; i++) 
      { 
       values[i] = props[i].GetValue(item, null); 
      } 
      dataTable.Rows.Add(values); 
     } 

     StringBuilder fileContent = new StringBuilder(); 
     foreach (var col in dataTable.Columns) 
      fileContent.Append(col.ToString() + ","); 

     fileContent.Replace(",", System.Environment.NewLine, fileContent.Length - 1, 1); 

     foreach (DataRow dr in dataTable.Rows) 
     { 
      foreach (var column in dr.ItemArray) 
       fileContent.Append("\"" + column.ToString() + "\","); 

      fileContent.Replace(",", System.Environment.NewLine, fileContent.Length - 1, 1); 
     } 

     //good place to validate File.Exist or catch exceptions 
     System.IO.File.WriteAllText(filePath, fileContent.ToString());    
    } 
+0

यदि आप हैं अपवाद को संभालने के लिए नहीं जा रहा है, इसे पहली जगह पकड़ने में कोई बात नहीं है। अपवादों को पकड़ा जाना चाहिए जहां उन्हें संभाला जा सकता है। – mason

+0

सच है, मैं उस कोड का हिस्सा हटाता हूं जिसका उपयोग मैं कर रहा था और इस भाग को भी भूलना भूल गया। –

संबंधित मुद्दे