如何从Richtextbox中删除不相关的句子?
How to delete irrevelant sentence from Richtextbox?
我使用 GPS 数据和 NMEA sentences.Even 我只想在我的 richtextbox 中查看并保存以 "$GNGGA" 和 "$GNTVG" 开头的句子,还有其他以不同的代码($GNGLL、$GLGSV、$GPGSV 等)。我应该怎么做才能将“$GNGGA”和“$GNTVG”句子发送到 Richtextbox?
这是我的代码;
string[] gParca;
string gKG, gDB, gUydular, gYukseklik, gEnlem, gBoylam, gYataySapma, gKilitlenme, gVelocity, gSaat;
private void GPSVelocity(string NMEA2)
{
gParca = NMEA2.Split(new char[] { ',' });
switch(gParca[0])
{
case "$GNVTG":
gVelocity = gParca[7];
break;
}
private void GPSDataBilgisi(string NMEA)
{
gParca=NMEA.Split(new char[] { ',' });
switch (gParca[0])
{
//Global Positioning System Fix data
case "$GNGGA":
gParca[2] = gParca[2].Replace('.', ',');
gParca[4] = gParca[4].Replace('.', ',');
}
}
private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
GPSDataBilgisi(serialPortGPS.ReadLine());
GPSVelocity(serialPortGPS.ReadLine());
}
private void GPSVel(string NMEA2)
{
if(checkBoxSave.Checked)
{
richTextBoxGPSData.AppendText(NMEA2);
}
}
private void GPSData(string NMEA)
{
if(checkBoxSave.Checked)
{
richTextBoxGPSData.AppendText(NMEA);
}
}
Disclaimer
As per OP's reply to my question, I am assuming serialPortGPS.ReadLine()
works exactly like TextReader.ReadLine()
.
既然你想过滤你得到的输入,那么在检索数据的函数中添加一个过滤器。
private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
for(int i = 0; i < 2; i++)
{
string line = serialPortGPS.ReadLine();
if(line.StartsWith("$GNGGA"))
GPSDataBilgisi(line);
if(line.StartsWith("$GNVTG"))
GPSVelocity(line);
}
}
如果该行以其他任何内容开头(例如 "HELLOIAMALINE"),则 if-check 都不会通过,代码也不会对该行做任何事情,它只会转到下一行。
您可以删除代码中的 switch
语句,不再需要它们(当然保留其中的逻辑!)
这里有一些注意事项,因为我认为您的代码和意图有点含糊。如果你能澄清其中任何一个,我可以更新我的答案。
- 根据您的问题,我假设您不想恰好调用
ReadLine()
两次(每种方法一次)。我推断你想单独读取每一行(因为 TextReader
通常是这样工作的),检查它是否以 "good" 值开头,然后执行需要它的函数。
我原来的例子专门读取2行并解析它们。如果您尝试从 gps 更新中读取 all 行,请按如下方式更改代码:
private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string line;
while((line = serialPortGPS.ReadLine()) != null)
{
if(line.StartsWith("$GNGGA"))
GPSDataBilgisi(line);
if(line.StartsWith("$GNVTG"))
GPSVelocity(line);
}
}
我的一部分想知道直接从 serialPortGPS
阅读是否是正确的方法。这纯粹是猜测,但我希望您的 SerialDataReceivedEventArgs e
包含一个 属性 和新收到的数据。您当前所做的事情并非不可能是正确的,但它比使用您从更新事件中收到的事件参数更不寻常。
您可以使用 LINQ 立即过滤出您需要的行(而不必手动迭代它们)。然而,Textreader
实现了一种模式,它一次只处理一行(类似于 yield return
)。如果您使用 LINQ,当您想要过滤它们时,您将最终同时处理所有行。如果您需要逐行处理(例如因为您正在处理的数据占用大量内存),那么您应该避免使用 LINQ
如果你想要一个 LINQ 的例子:
List<string> theLinesThatIWant =
allTheLines.Where(line => line.StartsWith("$GNGGA")).ToList()
但正如我所说,只有在您能够并且愿意同时将所有数据存储在内存中时才使用它。
我使用 GPS 数据和 NMEA sentences.Even 我只想在我的 richtextbox 中查看并保存以 "$GNGGA" 和 "$GNTVG" 开头的句子,还有其他以不同的代码($GNGLL、$GLGSV、$GPGSV 等)。我应该怎么做才能将“$GNGGA”和“$GNTVG”句子发送到 Richtextbox?
这是我的代码;
string[] gParca;
string gKG, gDB, gUydular, gYukseklik, gEnlem, gBoylam, gYataySapma, gKilitlenme, gVelocity, gSaat;
private void GPSVelocity(string NMEA2)
{
gParca = NMEA2.Split(new char[] { ',' });
switch(gParca[0])
{
case "$GNVTG":
gVelocity = gParca[7];
break;
}
private void GPSDataBilgisi(string NMEA)
{
gParca=NMEA.Split(new char[] { ',' });
switch (gParca[0])
{
//Global Positioning System Fix data
case "$GNGGA":
gParca[2] = gParca[2].Replace('.', ',');
gParca[4] = gParca[4].Replace('.', ',');
}
}
private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
GPSDataBilgisi(serialPortGPS.ReadLine());
GPSVelocity(serialPortGPS.ReadLine());
}
private void GPSVel(string NMEA2)
{
if(checkBoxSave.Checked)
{
richTextBoxGPSData.AppendText(NMEA2);
}
}
private void GPSData(string NMEA)
{
if(checkBoxSave.Checked)
{
richTextBoxGPSData.AppendText(NMEA);
}
}
Disclaimer
As per OP's reply to my question, I am assumingserialPortGPS.ReadLine()
works exactly likeTextReader.ReadLine()
.
既然你想过滤你得到的输入,那么在检索数据的函数中添加一个过滤器。
private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
for(int i = 0; i < 2; i++)
{
string line = serialPortGPS.ReadLine();
if(line.StartsWith("$GNGGA"))
GPSDataBilgisi(line);
if(line.StartsWith("$GNVTG"))
GPSVelocity(line);
}
}
如果该行以其他任何内容开头(例如 "HELLOIAMALINE"),则 if-check 都不会通过,代码也不会对该行做任何事情,它只会转到下一行。
您可以删除代码中的 switch
语句,不再需要它们(当然保留其中的逻辑!)
这里有一些注意事项,因为我认为您的代码和意图有点含糊。如果你能澄清其中任何一个,我可以更新我的答案。
- 根据您的问题,我假设您不想恰好调用
ReadLine()
两次(每种方法一次)。我推断你想单独读取每一行(因为TextReader
通常是这样工作的),检查它是否以 "good" 值开头,然后执行需要它的函数。
我原来的例子专门读取2行并解析它们。如果您尝试从 gps 更新中读取 all 行,请按如下方式更改代码:
private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string line;
while((line = serialPortGPS.ReadLine()) != null)
{
if(line.StartsWith("$GNGGA"))
GPSDataBilgisi(line);
if(line.StartsWith("$GNVTG"))
GPSVelocity(line);
}
}
我的一部分想知道直接从
serialPortGPS
阅读是否是正确的方法。这纯粹是猜测,但我希望您的SerialDataReceivedEventArgs e
包含一个 属性 和新收到的数据。您当前所做的事情并非不可能是正确的,但它比使用您从更新事件中收到的事件参数更不寻常。您可以使用 LINQ 立即过滤出您需要的行(而不必手动迭代它们)。然而,
Textreader
实现了一种模式,它一次只处理一行(类似于yield return
)。如果您使用 LINQ,当您想要过滤它们时,您将最终同时处理所有行。如果您需要逐行处理(例如因为您正在处理的数据占用大量内存),那么您应该避免使用 LINQ
如果你想要一个 LINQ 的例子:
List<string> theLinesThatIWant =
allTheLines.Where(line => line.StartsWith("$GNGGA")).ToList()
但正如我所说,只有在您能够并且愿意同时将所有数据存储在内存中时才使用它。