2013-10-08 29 views
1

我正在從數據庫值構建一個csv文件。當我在excel中打開csv時,所有內容都在一行中。爲了解決這個問題,我在每行之後添加了\n\r。現在,當我從第二行開始在Excel中打開時,第一列的其餘部分會有一個空值。CSV行中斷

IE:

value 1, value 2, value 3 
     , value 1, value 2, value 3 
     , value 1, value 2, value 3 
     , value 1, value 2, value 3 

我可以添加一個新行或第一值之前返回,但隨後有一個空的行和列。我怎樣才能排隊呢?

我的代碼:

try 
{ 
    connection = new iDB2Connection(connectionString); 
    connection.Open(); 
    command = new iDB2Command(commandString, connection); 

    reader = command.ExecuteReader(); 
    var dt = new DataTable(); 
    dt.Load(reader); 

    List<string> CsvList = new List<string>(); 

    foreach (DataRow row in dt.Rows) 
    { 
     foreach (var item in row.ItemArray) 
     { 
      CsvList.Add(item.ToString()); 
     } 
     if (i == 1) 
     { 
      CsvList.Add(" "); 
      CsvList.Add("Customer Service"); 
      CsvList.Add("Customer Service Representative" + "\r"); 
      // \r and \n not working 
     } 
    } 

    System.IO.StreamWriter streamWriter; 
    streamWriter = new System.IO.StreamWriter(fileName, true); 

    string CsvString = string.Join(",", CsvList.ToArray()); 
    streamWriter.WriteLine(CsvString); 
    streamWriter.Close(); 
    Console.WriteLine("File saved as " + fileName); 

    i++; 
} 
+1

讓你的生活更方便,使用'String.Join'和'Environment.NewLine' – gunr2171

+1

@ gunr2171他正在使用'Join',只是不正確... – Servy

回答

3

這將是一個很大的挫折感更容易,如果你剛剛建立的一個列表,而不是單一值的平面化列表。例如,當您使用Join時,由於您已經將列表展平,因此您在換行符值後面加上逗號。

的值而不是連接在一起的每一行,然後只保留整行的軌跡:

foreach (DataRow row in dt.Rows) 
{ 
    CsvList.Add(string.Join(",", row.ItemArray)); 
} 

現在,你有行的列表,我們可以只使用File.AppendAllLines簡單地編寫出所有行到文件末尾的:

File.AppendAllLines(fileName, CsvList); 

或者,如果你想流結果到文件,而不是複製所有的數據到一個列表,並立即拿着這一切在內存,你可以這樣做:

var lines = dt.AsEnumerable() 
    .Select(row => string.Join(",", row.ItemArray)); 
File.AppendAllLines(fileName, lines); 
+0

加入'ItemArray'的好捷徑 –

+0

@ChrisMantle呃,這是我自己寫了幾次以上的代碼。 – Servy

+0

只需要弄清楚如何添加一些硬編碼的值。謝謝你的幫助。 – BearSkyview

1

而不是創建一個陣列和處理增加新線自己,用StringBuilder,並在同一時間提交每行一個:

var sb = new StringBuilder(); 
foreach (DataRow row in dt.Rows) 
{ 
    List<string> csvList = new List<string>(); 
    foreach (var item in row.ItemArray) 
    { 
     csvList.Add(item.ToString()); 
    } 

    if (i == 1) 
    { 
     csvList.Add(" "); 
     csvList.Add("Customer Service"); 
     csvList.Add("Customer Service Representative"); 
    } 

    sb.WriteLine(string.Join(",", csvList)); 
} 

System.IO.StreamWriter streamWriter; 
streamWriter = new System.IO.StreamWriter(fileName, true); 

streamWriter.WriteLine(sb.ToString()); 
streamWriter.Close(); 
Console.WriteLine("File saved as " + fileName);