Ich bekomme eine "CSV-Datei" von einem Anbieter (unter Verwendung seiner API), aber was sie tun, ist nur das Ganze in ihre Antwort zu spucken. Es wäre kein bedeutendes Problem, außer dass natürlich einige dieser nervigen Menschen die Daten eingegeben und "Merkmale" wie Zeilenumbrüche eingegeben haben. Was ich jetzt mache, ist eine Datei für die Rohdaten zu erstellen und sie dann erneut zu öffnen, um die Daten zu lesen:
open RAW, ">", "$rawfile" or die "ERROR: Could not open $rawfile for write: $! \n";
print RAW $response->content;
close RAW;
my $csv = Text::CSV_XS->new({ binary=>1,always_quote=>1,eol=>$/ });
open my $fh, "<", "$rawfile" or die "ERROR: Could not open $rawfile for read: $! \n";
while ( $line = $csv->getline ($fh) ) { ...
Irgendwie scheint das ... unelegant. Es scheint, dass ich in der Lage sein sollte, die Daten aus dem $ response-> content (mehrzeiliger String) so zu lesen, als wäre es eine Datei. Aber ich zeichne eine totale Lücke, wie das geht. Ein Zeiger wäre sehr dankbar. Danke, Paul
csv
perl
filehandle
Paul RN
quelle
quelle
Ja, Sie können Text :: CSV_XS für einen String über dessen Funktionsschnittstelle verwenden
Beachten Sie, dass dies tatsächlich erforderlich ist
Text::CSV_XS
(normalerweise funktioniert Text :: CSV, aber nicht damit).Ich weiß nicht, warum dies in der OO-Schnittstelle nicht verfügbar ist (oder vielleicht aber nicht dokumentiert ist).
Während das Obige die Zeichenfolge direkt wie gewünscht analysiert, kann man auch den "uneleganten" Aspekt in Ihrem Beispiel verringern, indem Sie Inhalte direkt in eine Datei schreiben, während diese erfasst werden. Dies wird von den meisten Bibliotheken mit der
:content_file
Option in der LWP :: UserAgent :: get- Methode unterstützt.Lassen Sie mich auch beachten, dass die Bibliothek die meiste Zeit Inhalte dekodieren soll, um sie
LWP::UA
zu verwendendecoded_content
(siehe HTTP :: Response ).quelle
Ich habe dieses Beispiel mit Mojo :: UserAgent erstellt . Für die CSV-Eingabe habe ich verschiedene Datensätze aus den NYC Open Data verwendet . Dies wird auch im nächsten Update für Mojo Web Clients angezeigt .
Ich erstelle die Anfrage, ohne sie sofort zu stellen, und das gibt mir das Transaktionsobjekt
$tx
. Ich kann dasread
Ereignis dann ersetzen , damit ich die Zeilen sofort an Text :: CSV_XS senden kann :Das ist nicht so schön, wie ich es gerne hätte, weil alle Daten immer noch im Puffer angezeigt werden. Dies ist etwas ansprechender, aber es ist fragil in der Art, wie ich es in den Kommentaren notiere. Ich bin im Moment zu faul, um es besser zu machen, weil das sehr schnell haarig wird, wenn Sie herausfinden, wann Sie genug Daten haben, um einen Datensatz zu verarbeiten. Mein spezieller Code ist nicht so wichtig wie die Idee, dass Sie tun können, was Sie möchten, während der Transaktor Daten liest und an den Inhaltshandler weitergibt:
quelle