Forum: PC-Programmierung Absätze aus String entfernen C#


von Daniel B. (yzdani)


Lesenswert?

Hallo Gemeinde,

Mit
1
MyserialPort.readexisting();
 empfange ich eine Zeichenkette welche 3 Zeilen enthält.
Wie kann ich die 2 Zeilenumbrüche löschen?
Will danach den string auf eine bestimmte Stelle trimen.
so trimt er jetzt jede Zeile...

Danke im Voraus!

Gruss
Dani

von Borislav B. (boris_b)


Lesenswert?

Je nachdem was als Zeilenumbruch benutzt wird z.B.

myString = myString .Replace("\n", "");

von Uhu U. (uhu)


Lesenswert?

Boris P. schrieb:
> myString = myString .Replace("\n", "");

Es kommt natürlich darauf an, was für eine Zeilenendesequenz verwendet 
wird:

\r\n ist unter Windows üblich
\n unter Unix-ähnlichen Systemen

von Der Andere (Gast)


Lesenswert?

Das ist eine der ersten Fingerübungen, die man macht wenn man eine 
Programmiersprache lernt. Wenn sowas hier gefragt wird, dann ist ganz 
klar, der TO will nicht programmieren lernen sondern mit copy & paste 
was zusammenfrickeln ohne selbst was dafür zu investieren.
Guttemberg lässt grüssen.

von Tcf K. (tcfkao)


Lesenswert?

@Uhu: Beim Entfernen ist es egal, wenn man \r und \n entfernt liegt 
man auf jeden Fall auf der richtigen Seite...

von Daniel B. (yzdani)


Lesenswert?

Danke!
klappt jetzt!

Kann ich auch aus einem String eine gewisse zeichenfolge heraus filtern?

Z.b. so:

Test 1234 xx:xx:xx:xx:xx tset

und ich möchte nur das hier haben: xx:xx:xx:xx:xx


Problem der ganzen Sache ist, wenn ich den String zuschneide kann ich 
nur eine MAC Adresse anzeigen, ich möchte aber mehrer dann in eine 
Listbox einfügen...


Gruss
Dani

von mh (Gast)


Lesenswert?

Hä? Wie sieht denn Dein ursprünglicher String aus?

so?

Test1 1234 xx:xx:xx:xx:xx tset1
Test2 2345 xx:xx:xx:xx:xx tset2
Test3 3456 xx:xx:xx:xx:xx tset3

warum willst Du dann als erstes die Zeilenumbrüche entfernen, wenn Du an 
die MAC-Adressen willst. Verarbeite doch einfach Deinen Eingangsstring 
zeilenweise und schneide Die Zeilen entsprechend zu...

von Uhu U. (uhu)


Lesenswert?

Tcf K. schrieb:
> @Uhu: Beim Entfernen ist es egal, wenn man \r und \n entfernt
> liegt
> man auf jeden Fall auf der richtigen Seite...

Das wird aber mit Replace nicht klappen, wenn das Muster nicht passt.

von Daniel B. (yzdani)


Lesenswert?

INQUIRY_PARTIAL 0c:14:20:22:1d:62 200404
INQUIRY_PARTIAL 2c:54:cf:7b:3f:70 5a020c
INQUIRY 2
INQUIRY 0c:14:20:22:1d:62 200404
INQUIRY 2c:54:cf:7b:3f:70 5a020c


So schaut mein String aus ... am Anfang nicht gleich lang...

von hinten abschneiden und dann nur die mac Adressen rauskopieren ?
würde das gehen?

Gruss

Dani

von Der Andere (Gast)


Lesenswert?

Uhu U. schrieb:
> Das wird aber mit Replace nicht klappen, wenn das Muster nicht passt.

Er könnte z.B. alle \r durch nichts ersetzen und alle \n durch ein 
Blank.
Dann würde es bei Unix und Win passen. Wie ist das mit Apple, haben die 
nicht nochmal andere Zeilenumbrüche?

von Der Andere (Gast)


Lesenswert?

Daniel R. schrieb:
> von hinten abschneiden und dann nur die mac Adressen rauskopieren ?
> würde das gehen?

Schon mal was von regulären Ausdrücken gehört.
Dann lies dich mal ein, das kann auch C#. Suche einfach nach Ausdrücken 
in der Form aa:bb:cc:dd:ee:ff oder aa:bb:cc:dd
Wie das geht ist ne schöne Übung um was zu lernen.

von Tcf K. (tcfkao)


Lesenswert?

@DerAndere: Imho hatten die früher nur \r bin aber nicht sicher.

@Daniel Rüscher: Das ist ein Fall für sed
https://de.wikipedia.org/wiki/Sed_%28Unix%29

von mh (Gast)


Lesenswert?

Wenns "schön" sein soll, würde ich's mit Regular Expressions machen.
Wenn's nur Quick&Dirty sein muss, so (Python):
1
adresses = list()
2
for line in inputString:
3
    teile = line.split(" ")
4
    if len(teile > 2):
5
        addresses.append(teile[1])

Die entsprechenden Funktionen gibt es bestimmt auch in C#...

von Daniel B. (yzdani)


Lesenswert?

wie kann ich das jetzt so hinbiegen das er aus einem String die 
Mac-Adresse filtert?
Schreibt jetzt nur WENN NUR eine MAC-Adresse kommt
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
using System.Text.RegularExpressions;
7
8
namespace nach_muster_im_string_suchen_konsole
9
{
10
    class Program
11
    {
12
        static void Main(string[] args)
13
        {
14
            string eingabe = Console.ReadLine();
15
16
          
17
            var addMacReg = "^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$";
18
            Regex regex = new Regex(addMacReg);
19
          
20
            Match match = regex.Match(eingabe);
21
            if (match.Success)
22
            {
23
                Console.WriteLine(match.Value);
24
                Console.WriteLine("es war eine mac adressae dabei");
25
            }
26
          //  Console.WriteLine(eingabe);
27
            Console.ReadKey();
28
29
        }
30
    }
31
}

von Der Andere (Gast)


Lesenswert?

Tcf K. schrieb:
> @DerAndere: Imho hatten die früher nur \r bin aber nicht sicher.

Sowas hatte ich auch im Kopf. Völlig bescheuert, ja anders machen als 
alle anderen um möglichst inkompatibel zu sein.
Dem Idioten, der sich das ausgedacht hat gehört Prügel, genau wie dem, 
der sich ausgedacht hat in Windows in Pfaden und Dateinamen Blanks als 
gültige Zeichen zuzulassen.

von Daniel B. (yzdani)


Lesenswert?

ok jetzt klappts...kann aber nur eine Adresse einleisen... was muss ich 
verändern dass ich unbegrenzt viele einlesen kann? im ideal fall arrays 
füllen das ich die dann in eine Listbox geben kann..

Gruss
Dani

von Fräulein Eysenbarth (Gast)


Lesenswert?

Daniel R. schrieb:
> wie kann ich das jetzt so hinbiegen das er aus einem String die
> Mac-Adresse filtert?
> Schreibt jetzt nur WENN NUR eine MAC-Adresse kommt

Weil ^ und $ Zeilenanfang und Zeilenende markieren. Ich finde es aber 
gut, dass du dich in Bezug auf Regex informiert hast.
So sollte es funktionieren, denke ich:
1
static class Extensions
2
{    
3
  public static string ExtractMac(this string input)
4
  {      
5
    var match = MacRegex.Match(input);
6
    return match.Success ? match.Value : string.Empty; // oder null statt string.Empty
7
  }
8
9
  static readonly Regex MacRegex = new Regex("([0-9a-f]{2}:){5}([0-9a-f]{2})");
10
}
11
12
class Program
13
{
14
  static void Main(string[] args)
15
  {
16
    string str = "INQUIRY_PARTIAL 0c:14:20:22:1d:62 200404";
17
18
    var mac = str.ExtractMac();
19
20
    if (!string.IsNullOrEmpty(mac)) Console.WriteLine("MAC gefunden: " + str.ExtractMac());
21
    else Console.WriteLine("Keine MAC gefunden.");
22
}

von Daniel B. (yzdani)


Lesenswert?

Danke das du dir extra die mühe gemacht hast den Code zu tippen!!

aber wie kann ich mehrere Mac Adressen einlesen?

Wenn mehrere Geräte sichtbar sind bekomm ich mehrere MAC Adressen in 
einen String...

Gruss

Dani

von Fräulein Eysenbarth (Gast)


Lesenswert?

Daniel R. schrieb:
> Wenn mehrere Geräte sichtbar sind bekomm ich mehrere MAC Adressen in
> einen String...

Zeilenweise, wie oben beschrieben (d.h., der Input war wie im Beispiel 
und du hast die Zeilen nicht selbst umgebrochen)? Wenn nicht, 
funktioniert mein Vorschlag so nicht ...

> aber wie kann ich mehrere Mac Adressen einlesen?

Nur über Regex ginge es zwar (man muss dann natürlich iterieren), aber 
das ist meiner Meinung nach hier unnötig kompliziert. Ich würde einfach 
in Zeilen splitten und dann für jede Zeile ExtractMac aufrufen.

1
static class Extensions
2
{    
3
  public static string ExtractMac(this string input)
4
  {      
5
    var match = MacRegex.Match(input);
6
    return match.Success ? match.Value : string.Empty; // oder null statt string.Empty
7
  }
8
9
  public static IEnumerable<string> GetLines(this string input)
10
  {
11
    // Evtl. noch nachsehen, wie bei dir die Zeilen getrennt sind, siehe Diskussion oben.
12
    return input.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
13
  }
14
15
  static readonly Regex MacRegex = new Regex("([0-9a-f]{2}:){5}([0-9a-f]{2})");
16
}
17
18
class Program
19
{
20
  static void Main(string[] args)
21
  {
22
    // Beispiel
23
24
    string str = @"INQUIRY_PARTIAL 0c:14:20:22:1d:62 200404
25
INQUIRY_PARTIAL 2c:54:cf:7b:3f:70 5a020c
26
INQUIRY 2
27
INQUIRY 0c:14:20:22:1d:62 200404
28
INQUIRY 2c:54:cf:7b:3f:70 5a020c";
29
30
  var lines = str.GetLines();
31
  List<string> macs = new List<string>();
32
33
  foreach(var line in lines)
34
  {
35
    string mac = line.ExtractMac();
36
    if (!string.IsNullOrEmpty(mac)) macs.Add(mac);
37
  }
38
39
  // Alle gültigen Addressen sollten sich jetzt in "macs" befinden.
40
41
}

Falls die anderen Daten (INQUIRY_PARTIAL, INQUIRY, die zweite Zahl etc.) 
auch eine Rolle spielen , könnte man eine kleine Klasse schreiben, in 
der die jeweilige Zeile dann - evtl. gleich im Konstruktor - geparst 
wird (und die dann die entsprechenden Daten speichert).

von Daniel B. (yzdani)


Lesenswert?

Jetzt wird mir das ganze ein bisschen zu kompliziert...
Das mit "Static class extension" ist volles Neuland
Wie kann ich jetzt die macs in z.b eine Textbox schreiben?!

von Matthias L. (Gast)


Lesenswert?

system.environment.newline

von Fräulein Eysenbarth (Gast)


Lesenswert?

Daniel R. schrieb:
> Wie kann ich jetzt die macs in z.b eine Textbox schreiben?!

Verwendest du Windows Forms oder WPF? Ich würde eher ein List-Control 
einsetzen.

Mit einer Textbox (wie Matthias schon angedeutet hat):
1
macTextBox.Text = string.Join(Environment.NewLine, macs);

Nicht vergessen, die Eigenschaft "Multiline" der Textbox auf true zu 
setzen.

von Daniel B. (yzdani)


Lesenswert?

Moin Moin,

Funktioniert jetzt schon fast so wie ich will... warum löscht er den 
Eintrag in Macs wieder?
Wenn ich ein Haltepunkt auf macs setzte sehe ich das die Macs drinnen 
stehen aber wenn ich das Programm weiter laufen lasse löscht er diese 
wieder ?!

Wenn der String nicht mehr gelöscht wird,... wie kann ich diesen in ein 
Array umwandeln und dann in eine Listbox schreiben?

Ich arbeite auf der FORM

Gruss
Dani

: Bearbeitet durch User
von Daniel B. (yzdani)


Lesenswert?

Moin,

ich habe einen String mit mehrern Absätzen.
Wie kann ich diesen String bei einem Absatz in ein Array schreiben
string[0] // erste Zeile
string[1] // zweite Zeile usw.

Danke im Voraus!

Gruss
Dani

von Tom (Gast)


Lesenswert?


von Daniel B. (yzdani)


Lesenswert?

Gerade auch drauf gestoßen.

Trozdem Danke!

von Fräulein Eysenbarth (Gast)


Lesenswert?

Daniel R. schrieb:
> Funktioniert jetzt schon fast so wie ich will... warum löscht er den
> Eintrag in Macs wieder?
> Wenn ich ein Haltepunkt auf macs setzte sehe ich das die Macs drinnen
> stehen aber wenn ich das Programm weiter laufen lasse löscht er diese
> wieder ?!

Da wir dein Programm nicht kennen, kann man nur raten ... Vielleicht 
erzeugst du immer eine neue Instanz eine Liste (wie im Beispiel, aber 
das ist ja nur eine Konsolenanwendung, die das Prinzip zeigen sollte). 
Du musst die Liste in deinem Programm auf Klassenebene deklarieren bzw. 
auch gleich dort (oder im Konstruktor) initialisieren, nicht wie im 
Beispiel lokal in einer Methode.

class DeineKlasse
{
  // ...

  private List<string> macs = new List<string>();
}

Um den Inhalt der Liste zu löschen, kannst du macs.Clear() aufrufen.

> Wenn der String nicht mehr gelöscht wird,...

Welcher String? Meinst du den Inhalt der Liste?

> wie kann ich diesen in ein Array umwandeln und dann in eine Listbox
> schreiben?

Wenn die Daten in der Liste nicht mehr gelöscht werden, kannst du doch 
direkt die Liste verwenden. Oder die neuen Daten sofort in die Listbox 
setzen (in der Schleife, in der du die MACs zur Liste hinzufügst).

if (!string.IsNullOrEmpty(mac))
{
  macs.Add(mac);
  macListBox.Items.Add(mac);
}

Falls du die MACs wirklich nur anzeigen und nicht weiter verarbeiten 
willst, könntest du genau genommen auf die "macs"-Liste verzichten.

Den Inhalt der Listbox löschst du, wenn nötig, mit
macListBox.Items.Clear();
Das ist jetzt die einfachste Art und Weise, es geht auch eleganter 
(LINQ, Data-Binding, sortieren, filtern - evtl. doppelte Einträge 
möglich? -, ...). Aber da du offenbar noch mit den Grundlagen kämpfst, 
wäre so etwas wohl keine gute Idee. Evtl. solltest du erst einmal ein 
Tutorial zu C#-Grundlagen durcharbeiten, anstatt das Ganze übers Knie 
brechen zu wollen. Dann würdest du nicht so häufig festhängen ...

von Fräulein Eysenbarth (Gast)


Lesenswert?

Beitrag "Re: Absätze aus String entfernen C#"

// Evtl. noch nachsehen, wie bei dir die Zeilen getrennt sind
input.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);

Es ist aber der falsche Ansatz bei deinem Problem.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.