2012-06-05 2 views
2

Это первый раз, когда я работал с плоскими файлами. Мне нужно, чтобы это был простой текстовый файл NOT XML.Хранение данных в плоском файле

Я написал следующее, выбрав формат с разделителями-запятыми.

public static void DataTableToFile(string fileLoc, DataTable dt) 
    { 
     StringBuilder str = new StringBuilder(); 
     // get the column headers 
     foreach (DataColumn c in dt.Columns) 
     { 
      str.Append(c.ColumnName.ToString() + ","); 
     } 
     str.Remove(str.Length-1, 1); 
     str.AppendLine(); 
     // write the data here 
     foreach (DataRow dr in dt.Rows) 
     { 
      foreach (var field in dr.ItemArray) 
      { 
       str.Append(field.ToString() + ","); 
      } 
      str.Remove(str.Length-1, 1); 
      str.AppendLine(); 
     } 
     try 
     { 
      Write(fileLoc, str.ToString()); 
     } 
     catch (Exception ex) 
     { 
      //ToDO:Add error logging 
     } 
    } 

Мой вопрос: могу ли я сделать это лучше или быстрее? И str.Remove(str.Length-1, 1); есть, чтобы удалить последние ,, что является единственным способом, о котором я мог думать. Любые предложения?

+0

Вы по существу пытаетесь написать таблицу данных в формате CSV. См. Http://stackoverflow.com/questions/4959722/c-sharp-datatable-to-csv –

ответ

3

Использование

public static void DataTableToFile(string fileLoc, DataTable dt) 
{ 
    StringBuilder str = new StringBuilder(); 

    // get the column headers 
    str.Append(String.Join(",", dt.Columns.Cast<DataColumn>() 
             .Select(col => col.ColumnName)) + "\r\n"); 

    // write the data here 
    dt.Rows.Cast<DataRow>().ToList() 
      .ForEach(row => str.Append(string.Join(",", row.ItemArray) + "\r\n")); 

    try 
    { 
     Write(fileLoc, str.ToString()); 
    } 
    catch (Exception ex) 
    { 
     //ToDO:Add error logging 
    } 
} 
+0

Но это записывает только имена столбцов, а не данные. –

+0

@Tim Я считаю, что он предназначен для описания * техники *. Очевидно, что вы должны использовать что-то очень похожее на поэтапной основе. –

+0

@TimSchmelter: Ровно MarcGarvll. Он хочет, чтобы более быстрый код не был рендерингом. –

3

Ключевым моментом будет: нет необходимости строить его в памяти с StringBuilder - вместо него вы должны писать в файл через что-то вроде StreamWriter, т.е. через File.CreateText. API похож на StringBuilder, но вы не должны пытаться удалить - вместо этого, не добавляют - т.е.

bool first = true; 
foreach(...blah...) { 
    if(first) { first = false; } 
    else { writer.Write(','); } 
    ... write the data ... 
} 

В качестве другого рассмотрения: CSV является не только случай добавления запятых , Вам нужно подумать о цитируемом тексте (для данных с , в) и многострочных данных. Если данные очень просты. Вы также можете сделать формат более явным, чем просто .ToString(), что очень чувствительно к культуре. Классическим примером могут быть большие части Европы, которые используют , в качестве десятичного символа, поэтому «CSV» часто использует другой разделитель, чтобы избежать необходимости процитировать все. Если выбор доступен, лично Я бы всегда использовал TSV вместо CSV - менее проблематичным (теоретически, хотя вам все равно нужно обрабатывать данные с вкладками).