通过串口,我读了一些从秤上发来的数据。这是8个街区。看起来像是
Datum 07.12.2015
Zeit 10:29:43
Artikel Testxyz
等等。
我操纵数据然后将其写入CSV文件。 我的问题是以某种方式将数据写入文件的格式。 首先,每个数据都写在一个新的行上,就像它正在读取一样。但我希望在一行中包含所有8个,然后在新行中包含8个信息的下一个块,依此类推。 现在它在一条线上但是因此我得到了
System.String[]System.String[]System.String[]
而不是
07.12.2015 10:29:43 Testxyz
我之前遇到的这个问题并修复了它,但后来我还没有将它排成一行。 现在我把它放在一行但是再次使用System.String []。 这令人沮丧。
遵循代码部分:
public static void Read()
{
string pathImportFile = @"C:\Dokumente und Einstellungen\All Users\Desktop\WaageLAU";
string pathImportFileDate = "Heute";
string msgIn = "msgIn";
string msgInValid = "msgInValid";
string SpaltenBezeichnungen = "Datum\tZeit\tArtikel\tBrutto\tTara\tNetto\tHoch\tNiedrig";
string first = "first";
string second = "second";
string third = "third";
string fourth = "fourth";
string fifth = "fifth";
string sixth = "sixth";
string seventh = "seventh";
string eighth = "eighth";
// seperators
string[] Datum = new string[] {"Datum"};
string[] Zeit = new string[] {"Zeit"};
string[] Artikel = new string[] {"Artikel"};
string[] Brutto = new string[] {"Brutto"};
string[] Tara = new string[] {"Tara"};
string[] Netto = new string[] {"Netto"};
string[] Hoch = new string[] {"Hoch"};
string[] Niedrig = new string[] {"Niedrig"};
while (_continue)
{
try
{
msgIn = _serialPort.ReadLine();
}catch (TimeoutException) { }
if(msgIn != "msgIn" && msgIn != msgInValid)
{
msgInValid = msgIn.Replace("\t", "");
if(msgInValid != "msgInValid")
{
if (msgInValid.Contains("Datum"))
{
string date = DateTime.Now.ToString("yyyyMMdd");
pathImportFileDate = pathImportFile + " " + date + ".csv";
first = msgInValid.Split(Datum, StringSplitOptions.RemoveEmptyEntries).ToString();
}
else if (msgInValid.Contains("Zeit"))
{second = msgInValid.Split(Zeit, StringSplitOptions.RemoveEmptyEntries).ToString();}
else if (msgInValid.Contains("Artikel"))
{third = msgInValid.Split(Artikel, StringSplitOptions.RemoveEmptyEntries).ToString();}
else if (msgInValid.Contains("Brutto"))
{fourth = msgInValid.Split(Brutto, StringSplitOptions.RemoveEmptyEntries).ToString();}
else if (msgInValid.Contains("Tara"))
{fifth = msgInValid.Split(Tara, StringSplitOptions.RemoveEmptyEntries).ToString();}
else if (msgInValid.Contains("Netto"))
{sixth = msgInValid.Split(Netto, StringSplitOptions.RemoveEmptyEntries).ToString();}
else if (msgInValid.Contains("Hoch"))
{seventh = msgInValid.Split(Hoch, StringSplitOptions.RemoveEmptyEntries).ToString();}
else if (msgInValid.Contains("Niedrig"))
{
eighth = msgInValid.Split(Niedrig, StringSplitOptions.RemoveEmptyEntries).ToString();
String[] line = new string[] {first, second, third, fourth, fifth, sixth, seventh, eighth};
if(!File.Exists(pathImportFileDate))
{
try
{
using (System.IO.StreamWriter fileImport = new System.IO.StreamWriter(pathImportFileDate,true))
{
fileImport.WriteLine(SpaltenBezeichnungen);
}
}catch (TimeoutException) { }
}
try
{
using (System.IO.StreamWriter fileImport = new System.IO.StreamWriter(pathImportFileDate,true))
{
fileImport.Write(line);
}
}catch (TimeoutException) { }
Array.Clear(line, 0, line.Length);
}
else
{
// nichts machen bzw. auf Daten warten
}
}
}
}
}
答案 0 :(得分:0)
以下任何类型的错误:
second = msgInValid.Split(Zeit, StringSplitOptions.RemoveEmptyEntries).ToString();
string.Split(...)
返回一个字符串数组,如果您在字符串数组上调用ToString()
,则会得到值string[]
,然后将其存储在second
中。您必须将.Split(...)[0]
的相应值保存到second, third, etc.
。
msgInValid.Split(Zeit, StringSplitOptions.RemoveEmptyEntries)[0];
//or
msgInValid.Split(Zeit, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
如果数组中没有条目, FirstOrDefault
将不会引发任何错误。
string first = "Datum 07.12.2015";
var k = first.Split(new string[]{"Datum"}, StringSplitOptions.RemoveEmptyEntries)[0];
Console.WriteLine(k.Trim());
只需替换代码行:
fileImport.Write(line);
带
fileImport.Write(string.Join(",", line));
如果您想将每个后续数据桶写入新行,请使用WriteLine
。
注意:如果串口没有发送或跳过 Niedrig 的值,此代码将不会写任何内容。
答案 1 :(得分:0)
为什么不将您的分隔符声明为String
而不是String[]
。然后,您可以将fileImport.Write(line);
替换为fileImport.WriteLine(String.Join("\t", line));