将数组写入一行中的文件

时间:2015-12-07 09:40:46

标签: c#

通过串口,我读了一些从秤上发来的数据。这是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
                    }
            }
        }
    }   
}

2 个答案:

答案 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));