2017-12-04 6 views
2

Hallo Jungs,Haskell :: Parsing Zeile Text in eine Liste der Liste

ich eine Textdatei Parsen, die wie folgt aussehen:

114.474998474121 15.7440004348755 25.806999206543 -873 172 182 188 
114.46199798584 15.7419996261597 25.8799991607666 -1396 180 192 205 

Und Ich wünschte, es könnte so lauten:

[[114.475,15.744,25.807,-873.0,172.0,182.0,188.0], 
[114.462,15.742,25.88,-1396.0,180.0,192.0,205.0]] 

Derzeit gibt meinen Code für dieses Textanalyse nicht. Hier ist mein Code:

main = do 
    text <- readFile "mytext.txt" 
    let 
     pcVal = map read (words text) :: [Float] 
    print pcVal 
    return() 

Dieser Code der gesamten Text als eine einzige Liste wie folgt analysiert:

[114.475,15.744,25.807,-873.0,172.0,182.0,188.0, 
114.462,15.742,25.88,-1396.0,180.0,192.0,205.0] 

konnte ich nicht finden, wie die gesamte einzelne Zeile nehmen (in Textdatei) als eine Liste und die zweite Zeile als eine andere Liste bis zum Ende der Datei. Schätze, wenn jemand Erfahrung darin hat. Vielen Dank.

+1

Ich nehme an, Sie sind ein Anfänger - ein Tipp für die Zukunft, wenn Sie ein bisschen mehr Haskell wissen; Wiederholen Sie diese Übung und implementieren Sie einen Parser, anstatt nur eine Liste mit doppelten Werten zu haben. – epsilonhalbe

+0

ja @epsilonhalbe, ich bin ein Anfänger und fange an, diese Sprache zu mögen. Ich werde Ihren Rat für die Zukunft übernehmen. Vielen Dank! –

Antwort

7

Sie können die lines Funktion verwenden; zum Beispiel map words $ lines text.

Dies wäre auch eine gute Zeit für eine Hilfsfunktion, dh

let parse :: String -> [Float] 
    parse line = map read $ words line 
    pcVal = map parse $ lines text 
+0

Danke @Dan, ich habe doch einige Bugs in String - Chars ausprobiert. Ein wenig Bearbeiten dann funktioniert es! Ich poste die Antwort unten. –

+1

@SirDK Ich denke, die Typ Anmerkung, die ich hinzugefügt habe, sollte helfen. – Dan

0

Dank Dan für Linien als Lösung vorschlägt. Hier ist der Code, der gut mit meiner Frage funktioniert:

main = do 
    text <- readFile "mytext.txt" 
    let 
     readparse txtLines = map read txtLines :: [Float] 
     parse txtLines = map (words) (lines txtLines) 
     pcval = map readparse (parse text) 
    print pcVal 
    return() 

Hoffe, es hilft anderen auch. Danke und Prost!