2011-08-24 11 views
14

टेक्स्ट फ़ाइल से डेटासेट को भरने के तरीके के बारे में बहुत सारे उदाहरण ऑनलाइन हैं लेकिन मैं रिवर्स करना चाहता हूं। एकमात्र चीज जिसे मैं ढूंढने में सक्षम हूं this है लेकिन ऐसा लगता है ... अपूर्ण?एक सी # डेटासेट को एक टेक्स्ट फ़ाइल में निर्यात करें

मैं चाहता हूं कि यह एक पठनीय प्रारूप में हो, न केवल अल्पविराम से सीमित, इसलिए प्रत्येक पंक्ति पर कॉलम के बीच गैर-बराबर अंतर होने पर यह समझ में आता है।

Column1   Column2   Column3 
Some info  Some more info Even more info 
Some stuff here Some more stuff Even more stuff 
Bits    and    bobs 

नोट:: यहाँ मैं क्या मतलब का एक उदाहरण है मैं केवल कई DataTables के बारे में चिंता करने की कोई जरूरत तो मेरे डेटासेट भीतर एक DataTable है।

संपादित करें: जब मैंने कहा "पठनीय" मेरा मतलब मानव-पठनीय था।

अग्रिम धन्यवाद।

+0

आपको पता है कि यह केवल एक निश्चित फ़ॉन्ट के साथ लाइन करने जा रहा है, है ना? –

+0

हां, मुझे यह पता है। – bobble14988

उत्तर

15

यह चाहिए अंतरिक्ष बाहर निश्चित लंबाई फ़ॉन्ट पाठ अच्छी तरह से है, लेकिन इसका मतलब यह है कि यह पूरी DataTable दो बार कार्रवाई करेंगे (1 पारित: उत्पादन पाठ: स्तंभ प्रति सबसे लंबे समय तक पाठ मिल जाए, 2 पारित):

static void Write(DataTable dt, string outputFilePath) 
    { 
     int[] maxLengths = new int[dt.Columns.Count]; 

     for (int i = 0; i < dt.Columns.Count; i++) 
     { 
      maxLengths[i] = dt.Columns[i].ColumnName.Length; 

      foreach (DataRow row in dt.Rows) 
      { 
       if (!row.IsNull(i)) 
       { 
        int length = row[i].ToString().Length; 

        if (length > maxLengths[i]) 
        { 
         maxLengths[i] = length; 
        } 
       } 
      } 
     } 

     using (StreamWriter sw = new StreamWriter(outputFilePath, false)) 
     { 
      for (int i = 0; i < dt.Columns.Count; i++) 
      { 
       sw.Write(dt.Columns[i].ColumnName.PadRight(maxLengths[i] + 2)); 
      } 

      sw.WriteLine(); 

      foreach (DataRow row in dt.Rows) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        if (!row.IsNull(i)) 
        { 
         sw.Write(row[i].ToString().PadRight(maxLengths[i] + 2)); 
        } 
        else 
        { 
         sw.Write(new string(' ', maxLengths[i] + 2)); 
        } 
       } 

       sw.WriteLine(); 
      } 

      sw.Close(); 
     } 
    } 
+0

एक आकर्षण की तरह काम करता है।मुझे यह नहीं लगता कि यह डेटासेट के माध्यम से दो बार फिर से चल रहा है क्योंकि यह केवल छोटा है। इस समाधान पर विचार करने वाले अन्य लोग बड़े डेटासेट के साथ काम करने पर विकल्पों पर विचार करना चाहेंगे। धन्यवाद, रॉय! – bobble14988

+0

डाटासेट के बजाय डेटासेट (उदाहरण के लिए 'डीएस') में डेटासेट में एक डेटासेट –

+0

@SwethaVijayan पास में एकाधिक डेटाटेबल कैसे किया जाता है, फिर लाइन के ऊपर लाइन' foreach (डेटाटेबल डीटी में डीएसटेबल्स) डालें जो कहता है 'foreach (dt.Rows में DataRow पंक्ति) ' –

8

यह बेहतर है कि आप अपना डेटा एक्सएमएल प्रारूप में निर्यात करें। बस अपने डेटा तालिका के पंक्तियों पर पुनरावृति और पंक्तियाँ जोड़ें

DataSet ds = new DataSet(); 
ds.ReadXml(fileName); 
0

:

DataSet ds = new DataSet(); 
ds.WriteXml(fileName); 

आप एक xml पढ़ सकते हैं और नीचे की तरह डाटासेट डेटा भर सकते हैं:

डाटासेट इस काम के लिए एक विधि है आपकी फ़ाइल, उदाहरण में प्रदान की तरह

foreach (DataRow row in dt.Rows)    
{  

    object[] array = row.ItemArray;       
    for (i = 0; i < array.Length - 1; i++)     
    {        
    sw.Write(array[i].ToString() + ";");      
    }  

    sw.Write(array[i].ToString()); 

    sw.WriteLine(); 

} 

sw जहां एक StreamWrit है फ़ाइल को एर करें जहां आप डेटा को सहेजने वाले हैं। वास्तव में एक समस्या कहां है?

6

मैं क्या होता है:

foreach (DataRow row in myDataSet.Tables[0].Rows) 
{ 
    foreach (object item in row.ItemArray) 
    { 
     myStreamWriter.Write((string)item + "\t"); 
    } 
    myStreamWriter.WriteLine(); 
} 

हो सकता है कि अगर आप हेडर चाहते छोरों से पहले स्तंभ नाम जोड़ें। मुझे लगता है कि, हालांकि, सरल होने के नाते, चाल करना चाहिए।

2

नीचे के बारे में क्या?

public static void Write(DataTable dt, string filePath) 
     { 
      int i = 0; 
      StreamWriter sw = null; 
       sw = new StreamWriter(filePath, false); 
       for (i = 0; i < dt.Columns.Count - 1; i++) 
       { 
        sw.Write(dt.Columns[i].ColumnName + " "); 
       } 
       sw.Write(dt.Columns[i].ColumnName); 
       sw.WriteLine(); 
       foreach (DataRow row in dt.Rows) 
       { 
        object[] array = row.ItemArray; 
        for (i = 0; i < array.Length - 1; i++) 
        { 
         sw.Write(array[i] + " "); 
        } 
        sw.Write(array[i].ToString()); 
        sw.WriteLine(); 
       } 
       sw.Close(); 
     } 
0

मैं सॉफ्टवेयर उद्योग में शुरुआत कर रहा हूं और बस आपकी मदद करने की कोशिश कर रहा हूं। यह आपकी समस्या का अंतिम समाधान नहीं हो सकता है।

मैंने आपके द्वारा लिंक किए गए लिंक को पढ़ लिया है। यह सच है कि यह केवल अल्पविराम प्रारूप में निर्यात कर रहा है। यदि आप अपने जैसे तनाव को निर्यात करना चाहते हैं तो आपको कुछ अतिरिक्त प्रयास करना होगा। LINQ आपके काम को बहुत बढ़ाएगा। आपको क्या करना है: 1) डेटा तालिका में प्रत्येक कॉलम की अधिकतम चौड़ाई की गणना करें (LINQ का उपयोग करके यह एक कथन में किया जा सकता है अन्यथा आपको foreach की सहायता लेनी होगी)। 2) पाठ फ़ाइल उपयोग के लिए वास्तविक सेल मान wrinting से पहले स्ट्रिंग। पहली चरण में गणना चौड़ाई के अनुसार स्थिति के लिए प्रारूप।

List<int> ColumnLengths = new List<int>(); 

     ds.Tables["TableName"].Columns.Cast<DataColumn>().All((x) => 
     { 
      { 
       ColumnLengths.Add(ds.Tables["TableName"].AsEnumerable().Select(y => y.Field<string>(x).Length).Max()); 
      } 
      return true; 
     }); 


     foreach (DataRow row in ds.Tables["TableName"].Rows) 
     { 
      for(int col=0;col<ds.Tables["TableName"].Columns.Count;col++) 
      { 
       SW.Write(row.Field<string>(ds.Tables["TableName"].Columns[col]).PadLeft(ColumnLengths[col] + (4 - (ColumnLengths[col] % 4)))); 
      } 
      SW.WriteLine(); 
     } 

आशा है कि आपको यह सहायक मिलेगा।

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