Чтение файлов db c и блока строк внутри цикла - PullRequest
1 голос
/ 09 апреля 2020

мой вопрос касается чтения файла .db c и внутреннего блока текста, который повторяется в той же форме, примерно так:

BO_ 199 WheelInfoIEEE: 8 ABS
 SG_ WheelSpeedFR : 32|32@1- (1,0) [0|1300] "1/min"  GearBox,EngineControl
 SG_ WheelSpeedFL : 0|32@1- (1,0) [0|1300] "1/min"  GearBox,EngineControl

BO_ 200 WheelInfo: 8 ABS
 SG_ WheelSpeedRR : 48|16@1+ (0.02,0) [0|1300] "1/min"  GearBox
 SG_ WheelSpeedRL : 32|16@1+ (0.02,0) [0|1300] "1/min"  GearBox
 SG_ WheelSpeedFR : 16|16@1+ (0.02,0) [0|1300] "1/min"  GearBox
 SG_ WheelSpeedFL : 0|16@1+ (0.02,0) [0|1300] "1/min"  GearBox

BO_ 1020 GearBoxInfo: 1 GearBox
 SG_ EcoMode : 6|2@1+ (1,0) [0|1] ""  DashBoard,EngineControl
 SG_ ShiftRequest : 3|1@1+ (1,0) [0|0] ""  EngineControl
 SG_ Gear : 0|3@1+ (1,0) [1|5] ""  ABS,DashBoard,EngineControl

Я могу прочитать, если есть только один блок, и сохранить в БД, если больше, чем один, я получаю все данные в два или три раза. Я пишу код в C#, вот код:

//MESSAGE  ==> BO_
var tmessageid = d.Where(g => g.Contains("BO_ "));
string[] _messageid;
//SIGNAL ==> SG_
var signal = d.Where(g => g.Contains("SG_ "));
string[] _signal;                      
foreach (var item in tmessageid)                   
{
_messageid = item.Split(new string[] { "BO_ " }, StringSplitOptions.None);               
message_id = _messageid[1]; //BO_ 199 WheelInfoIEEE: 8 ABS
string[] sentenses = message_id.Split(' ');
messageId = sentenses[0];
message_name = sentenses[1].Replace(":", "");                 
foreach (var itemsignal in signal)
{
_signal = itemsignal.Split(new string[] { "SG_ " },         StringSplitOptions.None);
signal_id = _signal[1];//SG_ WheelSpeedFR : 32|32@1- (1,0) [0|1300] "1/min"  GearBox,EngineControl
string[] sentensessignal = signal_id.Split(' ');
signal_name = sentensessignal[0];
signal_start_bit = sentensessignal[2];
signal_start_bit = signal_start_bit.Split('|')[0];
string signallength = sentensessignal[2];
signal_lenght = signallength.Split('|', '@')[1];
//Add to DB
try
{
DataRow r = rimacDataSet.Tables["podaci"].NewRow();
r["imefile"] = ime_file;
r["nodes"] = nodes;
r["messageid"] = messageId;
r["messagename"] = message_name;
r["signalname"] = signal_name;
r["signalstartbit"] = signal_start_bit;
r["signallength"] = signal_lenght;
rimacDataSet.Tables["podaci"].Rows.Add(r);
podaciTableAdapter.Update(rimacDataSet);
}
catch (Exception ex)
{
MessageBox.Show("Error in add new .dbc file!", ex.Message.ToString());
}    
}                
}     

Любая помощь, как читать блок за блоком:

BO_ 199 WheelInfoIEEE: 8 ABS
 SG_ WheelSpeedFR : 32|32@1- (1,0) [0|1300] "1/min"  GearBox,EngineControl
 SG_ WheelSpeedFL : 0|32@1- (1,0) [0|1300] "1/min"  GearBox,EngineControl
From this I need to get 2 rows in DB:
199  WheelInfoIEEE 8  WheelSpeedFR   32   32
199  WheelInfoIEEE 8  WheelSpeedFL    0   32    

Любые советы, что я сделал wornog в моем коде. БЛАГОДАРНОСТЬ.

1 Ответ

0 голосов
/ 09 апреля 2020

сначала вы должны читать построчно, потому что их последовательность важна, и с некоторыми классами вы можете реализовать протокол, если у вас есть документация, это проще, но просмотр файла также возможен:

public class DBCFile
{
    public DBCFile(string content = null)
    {
        if (!string.IsNullOrEmpty(content))
        {
            string[] lines = content.Replace("\r","").Split('\n');

            foreach (string line in lines)
            {
                if (!String.IsNullOrWhiteSpace(line.Trim()))
                {
                    if (line.Trim().StartsWith(DBCHeader.Prefix))
                    {
                        //it's a header
                        Headers.Add(new DBCHeader(line));
                    }
                    else if (line.Trim().StartsWith(DBCRecord.Prefix))
                    {
                        //it's a record
                        Headers.LastOrDefault().Records.Add(new DBCRecord(line));
                    }
                    else
                    {
                        //unidentified line
                    }
                }
            }
        }
    }


    public List<DBCHeader> Headers { get; set; } = new List<DBCHeader>();


    public void Print()
    {
        foreach (DBCHeader h in Headers)
        {
            Console.WriteLine(h.HeaderType.ToString() + " - " + h.Name);

            foreach (DBCRecord r in h.Records)
            {
                Console.WriteLine($"{r.Name} - {r.Value1} - {r.Value2} - {r.Value3} - {r.Value4} - {r.Value5} ");
            }
        }
    }
}
public class DBCHeader
{
    public static string Prefix = "BO_";
    public DBCHeader(string line = null)
    {
        if (!String.IsNullOrWhiteSpace(line) && line.Contains(":"))
        {
            //BO_ 199 WheelInfoIEEE: 8 ABS
            string[] vs = line.Split(':');
            this.Name = vs.Length >1 ?  vs[1].Trim() : String.Empty;

            string[] haux = vs[0].Split(' ');
            if (int.TryParse(haux[1], out int id))
            {
                this.HeaderType = (DBCHeaderType)id;
            }
        }
    }
    public DBCHeaderType HeaderType { get; set; }
    public string Name { get; set; }
    public string NameID { get => Name.Split(' ')[0]; }

    public List<DBCRecord> Records { get; set; } = new List<DBCRecord>();
}
public class DBCRecord
{
    public static string Prefix = "SG_";
    public DBCRecord(string line = null)
    {
        if (!String.IsNullOrWhiteSpace(line) && line.Contains(":"))
        {
            //SG_ WheelSpeedRR : 48|16@1+ (0.02,0) [0|1300] "1/min"  GearBox
            string[] aux  = line.Trim().Split(':');
            string[] values = aux[1].Trim().Split(' ');
            this.Name = aux[0].Trim().Split(' ')[1];
            this.Value1 = values.Length > 0 ? values[0] : String.Empty;
            this.Value2 = values.Length > 1 ? values[1] : String.Empty;
            this.Value3 = values.Length > 2 ? values[2] : String.Empty;
            this.Value4 = values.Length > 3 ? values[3] : String.Empty;
            this.Value5 = values.Length > 4 ? values[4] : String.Empty;
        }
    }

    public string Name { get; set; }
    public string Value1 { get; set; }
    public string Value1A { get => Value1.Split('|')[0]; }
    public string Value1B { get => Value1.Split('|')[1].Split('@')[0]; }
    public string Value2 { get; set; }
    public string Value3 { get; set; }
    public string Value4 { get; set; }
    public string Value5 { get; set; }

}

public enum DBCHeaderType
{
    Undefined = -1,
    WheelInfoIEEE = 199,
    WheelInfo = 200,
    GearBoxInfo = 1020
}

Пример:

    static void Main(string[] args)
    {
        string fileContent =
@"
BO_ 199 WheelInfoIEEE: 8 ABS
 SG_ WheelSpeedFR : 32|32@1- (1,0) [0|1300] ""1/min""  GearBox,EngineControl
 SG_ WheelSpeedFL : 0|32@1- (1,0) [0|1300] ""1/min""  GearBox,EngineControl

BO_ 200 WheelInfo: 8 ABS
 SG_ WheelSpeedRR : 48|16@1+ (0.02,0) [0|1300] ""1/min""  GearBox
 SG_ WheelSpeedRL : 32|16@1+ (0.02,0) [0|1300] ""1/min""  GearBox
 SG_ WheelSpeedFR : 16|16@1+ (0.02,0) [0|1300] ""1/min""  GearBox
 SG_ WheelSpeedFL : 0|16@1+ (0.02,0) [0|1300] ""1/min""  GearBox

BO_ 1020 GearBoxInfo: 1 GearBox
 SG_ EcoMode : 6|2@1+ (1,0) [0|1] """"  DashBoard,EngineControl
 SG_ ShiftRequest : 3|1@1+ (1,0) [0|0] """"  EngineControl
 SG_ Gear : 0|3@1+ (1,0) [1|5] """"  ABS,DashBoard,EngineControl ";



        DBCFile file = new DBCFile(fileContent);
        file.Print();
    }

Результат:

enter image description here

Из этого мне нужно получить 2 строки в БД:

199 WheelInfoIEEE 8 WheelSpeedFR 32 32

199 WheelInfoIEEE 8 WheelSpeedFL 0 32

DBCHeader h = file.Headers.FirstOrDefault();
foreach (DBCRecord r in h.Records)
{
    Console.WriteLine((int)h.HeaderType + " " + h.HeaderType + " " + h.NameID + " - " + r.Name + " - " + r.Value1A + " / " + r.Value1B) ;
}

Результат:

enter image description here

https://github.com/rovannlinhalis/ReadDBC-File-Example

Редактировать:

Классы читают все значения, вы просто нужно взять те, которые вам нужны. Извините за такие имена, как «Value1», я не знаю, что означает каждое значение, чтобы дать лучшее имя. Я изменил мой пример на вывод в качестве вашего примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...