Netroshin - Fr 01.07.22 19:24
Titel: Datei nach Zahlen sortieren nicht möglich
Hallo an alle!
Mein erster Beitrag hier auf dem Forum, da ich leider keine konkrete Antwort auf meine Programmierung finde, die richtig läuft.
Aus mehreren Internetseiten finde ich die automatische Sortierung mehrerer Zeilen aus einer Datei. Dennoch funktioniert sie aus mir unbekannten Gründen nur "halb".
Erstmal die Links, die ich verwendet habe:
Vorgehensweise: Sortieren oder Filtern von Textdaten nach einem beliebigen Wort oder Feld (LINQ)(C#) [
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/linq/how-to-sort-or-filter-text-data-by-any-word-or-field-linq]
How to: Reorder the Fields of a Delimited File (LINQ) (Visual Basic) [
https://docs.microsoft.com/de-de/dotnet/visual-basic/programming-guide/concepts/linq/how-to-reorder-the-fields-of-a-delimited-file]
Beide sagen aus, dass die Zeilen in einer Liste gesplittet werden und dann nach einer Spalte sortiert werden, die man eingibt.
Allerdings wird die Zahl ja nicht als
int sondern als
string wahrgenommen, also wird immer der Anfang des Strings ausgewertet.
Mein Code sieht wie folgt aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| string[] RanglisteGesamt = File.ReadAllLines(RanglistenPfad); foreach (string str in RunQuery(RanglisteGesamt, 0)) { RanglisteSortiert = RanglisteSortiert + "\n" + str; } File.WriteAllText(RanglistenPfad, RanglisteSortiert);
static IEnumerable<string> RunQuery(IEnumerable<string> source, int num) { var scoreQuery = from line in source let fields = line.Split(new char[] {'\\'}) orderby fields[num] select line;
return scoreQuery; } |
Alles, was dabei herauskommt, ist das Ergebnis: (Die 2. Spalte soll sortiert werden)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| MissingName\3\18 auraaa_brw\31\37072 MissingName\35\53470 MissingName\37\46678 MissingName\40\52444 shrenix\41\58984 MissingName\47\91957 Netroshin\50\112577 MissingName\54\147380 MissingName\6\264 MissingName\7\213 MissingName\7\333 MissingName\73\2411 MissingName\8\861 MissingName\8\462 MissingName\9\1094 MissingName\9\571 MissingName\9\351 MissingName\91\742072 |
Mache ich aus der Zeile
int, ist der Text im Weg. Gibt es eine Lösung, ohne dass ich aus diesem einen
string ein
int machen muss mit einer weiteren Funktion?
Danke schonmal für eure Antworten.
Moderiert von Th69: URL-Titel hinzugefügt
Moderiert von Th69: Quote- durch C#-Tags ersetzt
Moderiert von Th69: C#- durch Code-Tags ersetzt
Moderiert von Th69: C#-Tags hinzugefügtModeriert von Th69: Topic aus C# - Die Sprache verschoben am Mi 21.12.2022 um 13:13
Th69 - Fr 01.07.22 19:58
Hallo und :welcome:,
da sieht man, daß die Doku-Beispiele doch oftmals sehr vereinfacht sind (daher sind die Zahlenwerte dort alle gleich lang).
Wenn du nach den Zahlen sortieren willst, dann mußt du auch Zahlenwerte vergleichen.
Am einfachsten wohl per
Int32.Parse [
https://docs.microsoft.com/de-de/dotnet/api/system.int32.parse]:
C#-Quelltext
1: 2: 3: 4:
| var scoreQuery = from line in source let fields = line.Split(new char[] {'\\'}) orderby Int32.Parse(fields[num]) select line; |
Ralf Jansen - Fr 01.07.22 21:06
Wenn du nach einer beliebigen Spalte sortieren willst könnte man die Texte wieder auf gleiche Länge bringen. Funktioniert aber nur wenn du je Spalte eine Annahme für deren maximal Länge triffst bzw. treffen kannst.
C#-Quelltext
1: 2: 3: 4:
| var scoreQuery = from line in source let fields = line.Split('\\') orderby fields[num].PadLeft(myLovelyMaxColumnWidth) select line; |
Gibts bei
File.WriteAllLines ein Problem mit dem NewLine Character? Hätte gedacht das ist spätestens seit Net. Core einstellbar.
Edit: Näh dann sortiert Text falsch. Du musst vermutlich vorher anhand von num entscheiden ob das ein Text oder Int Spalte ist und dann das passende Linq Statement (mit Int.Parse oder ohne) wählen.