2016-07-13 9 views
1

Ich habe eine for-Schleife, in der ich in jedem Zyklus 5 Werte bekomme. Ich legte die CSV-Datei, aber die Datenanordnung ist nicht korrekt.CSV Daten Formatierung in einer linearen Weise

for (int i = 0, offset = 5; i < num_meters; i++, offset += 25) 
{ 

    float f_voltage, f_current, f_kw, f_kwh, f_freq, f_pf; 
    f_voltage = (float)Math.Round(System.BitConverter.ToSingle(my_app_msg.msg_data, (offset + 1)), 2); // voltage 
    f_current = (float)Math.Round(System.BitConverter.ToSingle(my_app_msg.msg_data, (offset + 5)), 5); // current 
    f_freq = (float)Math.Round(System.BitConverter.ToSingle(my_app_msg.msg_data, (offset + 9)), 5); // freq 
    f_pf = (float)Math.Round(System.BitConverter.ToSingle(my_app_msg.msg_data, (offset + 13)), 5); // pf 
    f_kw = (float)Math.Round(System.BitConverter.ToSingle(my_app_msg.msg_data, (offset + 17)), 2); // kw 
    f_kwh = (float)Math.Round(System.BitConverter.ToSingle(my_app_msg.msg_data, (offset + 21)), 2); // kwhr 
    //Store in CSV 
    vol2 = f_voltage.ToString(); 
    Curr2 = f_current.ToString(); 
    Feq2 = f_freq.ToString(); 
    PF2 = f_pf.ToString(); 
    power2 = f_kw.ToString(); 
    energy2 = f_kwh.ToString(); 
    DateTime time = DateTime.Now; 
    string Data = (time.ToString("u") + "," + power + "," + energy + "," + vol + "," + Curr + "," + Feq + "," + PF + "," + space + ","); 


    //Putting in CSV 
    using (StreamWriter sw = new StreamWriter(pathname + "MeterLogDataON_" + System.DateTime.Now.ToString("dd-MM-yyyy") + ".csv", true)) 
    { 
     sw.WriteLine(Data + "\t"); 
    } 
} 

Aber der Wert, den ich in CSV möchte, ist so.

VAlue1 VAlue1 VAlue1 VAlue1 VAlue1 | VAlue2 VAlue2 VAlue2 VAlue2 VAlue2 | VAlue3...so on. 

aber ich vor Problem wie meine Daten auf diese Weise gespeichert ist

VAlue1 VAlue1 VAlue1 VAlue1 VAlue1 
VAlue2 VAlue2 VAlue2 VAlue2 VAlue2 
+2

zeigen Sie den Code, der die Werte in der CSV tatsächlich schreibt. – Enigmativity

+0

@Enigmatismus ich habe es über –

+0

geschrieben Verwenden Sie 'Write()' anstelle von 'WriteLine()' –

Antwort

2

Wenn Sie sw.Write keine neue Linie an jeder Schleife erstellen will nur statt sw.WriteLine

//Putting in CSV 
using (StreamWriter sw = new StreamWriter(pathname + "MeterLogDataON_" + System.DateTime.Now.ToString("dd-MM-yyyy") + ".csv", true)) 
{ 
    sw.Write(Data + "\t"); 
} 

Dies wird eine zusätzliche Registerkarte am Ende der Schleife, und Ihr Code öffnet und schließt den Strom an jeder Schleife erstellen. Ich schlage vor, diesen Code zu ändern, um einen Stringbuilder zu verwenden, wo Sie den Text, während Sie Schleife über Ihre Daten hinzufügen und schreiben alles am Ende

StringBuilder sb = new StringBuilder(); 
for (int i = 0, offset = 5; i < num_meters; i++, offset += 25) 
{ 
    .................... 
    string Data = ...... 
    sb.Append(Data + "\t"); 
} 
// Remove the last tab 
if(sb.Length > 0) sb.Length--; 

string filename = (pathname + "MeterLogDataON_" + System.DateTime.Now.ToString("dd-MM-yyyy") + ".csv" 
File.WriteAllText(filename, sb.ToString()); 

oder, wenn Sie frühere Daten zu

File.AppendAllText(filename, sb.ToString()); 
anhängen
+1

@steave danke :) –

1

Versuchen Sie Write(string value) Methode statt WriteLine(string value) z. sw.Write(Data + "|");

using (StreamWriter sw = new StreamWriter(pathname + "MeterLogDataON_" + System.DateTime.Now.ToString("dd-MM-yyyy") + ".csv", true)) 
{ 
      sw.Write(Data + "|"); 
} 
Verwandte Themen