2011-01-09 10 views
0

Ich habe ein kleines Projekt, das ich in Haskell versuchen möchte. Eine Reihe von begrenzten Daten im folgenden Format gegeben:Wie kann ich sql-Inserts aus pipe-separierten Daten erzeugen?

1 | Star Wars: Episode IV - eine neue Hoffnung | 1977 | Aktion, Science-Fiction | George Lucas 2 | Titanic | 1997 | Drama, Geschichte, Romantik | James Cameron

In Haskell, wie kann ich sql einfügen Anweisungen in diesem Format generieren?

Einsatz in Tabellenwerte (1, "Star Wars: Episode IV - Eine neue Hoffnung" 1977" , "Aktion, Sci-Fi", "George Lucas", 0); Einsatz in Tabellenwerte (2, "Titanic", 1997, "Drama, Geschichte, Romantik", "James Cameron", 0);

Um das Problem zu vereinfachen, lassen Sie uns für einen Parameter um zu sagen, welche Spalten Text oder numerisch sind. (ZB 0, 1,0,1,1)

Hier ist eine Lösung in Perl. Nun möchte Ich mag Haskell zu meinem Toolkit hinzuzufügen.

 
my @ctypes=qw/0 1 0 1 1/; 

while(<>) { 
    chop; 
    @F=split('\|', $_); 
    print "insert into table values("; 
    foreach my $col (@F) { 
    my $type=shift(@ctypes); 
    print ($type == 1 ? '"'.$col.'"' : $col); 
    print ","; 
    } 

    print "0);\n"; 
} 

Antwort

4
import Control.Arrow 
import Data.List 

main :: IO() 
main = interact $ unlines . map (makeInsert . splitOn '|') . lines 

splitOn :: (Eq a) => a -> [a] -> [[a]] 
splitOn delim = unfoldr (fmap break') . return 
    where break' = second (stripPrefix [delim]) . break (== delim) 

makeInsert :: [String] -> String 
makeInsert parts = "insert into table values(" ++ intercalate "," values ++ ");" 
    where values = zipWith ($) [id, show, id, show, show] parts ++ ["0"] 

obwohl Sie Data.List.Split.splitOn statt Schreiben Sie Ihre eigene verwenden möchten, und show ist nicht unbedingt der richtige Weg, Strings zu zitieren.

3

Lesen Sie die Daten ein, teilen Sie die Pipe-Symbole auf, geben Sie alle Werte korrekt zurück und verwenden Sie die String-Verkettung, um Ihre Abfrage zu erstellen.

+1

Zusammenfassung Antwort, aber ein +1 für "alle Ihre Werte korrekt zu entkommen". http://xkcd.com/327/ –

+0

Sie sollten die Werte überhaupt nicht wirklich entkommen. Stattdessen sollten Sie einen '?' - Platzhalter verwenden und den tatsächlichen Wert separat für die Datenbankbibliothek angeben. – dave4420

+0

Sie haben Recht. Aber die Frage lautete speziell über das Einfügen von Anweisungen. – Daniel

Verwandte Themen