2017-07-13 38 views
0

我創建從數據reader.my代碼csv文件來的所有值是這樣的:而生成CSV在1分第一列

While (dr.Read()) 

      sw = New StreamWriter(hht_Storage & "\Export\" & strfilename & ".csv", True) 
      prcount = 0 
      fvalues = "" 
      For I = 0 To dr.FieldCount - 1 
       If fvalues = "" Then 
        fvalues = IIf(IsDBNull(dr(I)), "", dr(I)) 
        fvalues = Trim(Replace(fvalues, "'", "")) 
       Else 
        fvalues = fvalues & vbTab 
        fvalues = fvalues & IIf(IsDBNull(dr(I)), "", dr(I)) 
        fvalues = Trim(Replace(fvalues, "'", "")) 
       End If 
      Next I 

      sw.WriteLine(fvalues) 
      prcount = prcount + 1 
      sw.Close() 
     End While 

但在我CSV.i的第一列即將所有值要顯示每個csv列中的每個值。
任何幫助是非常可觀的。

+0

我認爲,這將是一個更好的方式來增加你的領域限制就在'下一步I'前面。如果你想獲得更好的性能,那麼使用StringBuilder而不是fvalues。 – muffi

+0

@ muffi,在這種情況下,我可以重新寫我的代碼。 – user3262364

+0

使用stringbuilder是可選的。無論如何,它也可以使用字符串。但是你的限制器是什麼?我認爲,它是'vbTab',對吧?在這種情況下,將此行向下移動到'Next'前面:'fvalues = fvalues&vbTab' – muffi

回答

0

數據讀取器類實現IEnumerable接口,這意味着你可以調用Cast擴展方法得到一個IEnumerable(Of Object),這是該String.Join方法接受一個類型:

Using writer As New StreamWriter("file path here") 
    While myDataReader.Read() 
     writer.WriteLine(String.Join(ControlChars.Tab, myDataReader.Cast(Of Object)())) 
    End While 
End Using 

如果您需要處理每一個項目,那麼你可以簡單地添加一個Select電話:

Using writer As New StreamWriter("file path here") 
    While myDataReader.Read() 
     writer.WriteLine(String.Join(ControlChars.Tab, 
            myDataReader.Cast(Of Object)(). 
                Select(Function(o) o.ToString(). 
                     Trim(). 
                     Replace("'", 
                       String.Empty)))) 
    End While 
End Using 

這就是現在經過上午IEnumerable(Of String)String.Join但其他Ø無論如何,verload只需在每個項目上調用ToString即可。

0

這應該工作(如果你想改變限制器vbTab):

Dim sb As New Text.StringBuilder 
    sw = New StreamWriter(hht_Storage & "\Export\" & strfilename & ".csv", True) 
    prcount = 0 
    While (dr.Read()) 
     sb.Clear() 
     For I As Integer = 0 To dr.FieldCount - 1 
      If IsDBNull(dr(I)) = False Then sb.Append(dr(I).ToString) 
      sb.Append(";") 'Field limiter 
     Next I 
     sw.WriteLine(sb.ToString) 
     prcount = prcount + 1 
    End While 
    sw.Close()