2009-06-03 5 views
1

Ich habe eine CSV-Datei, die aus einem Ticketing-System extrahiert wurde (ich habe keinen direkten DB-Zugriff) und müssen ein paar Spalten an diese aus einer anderen Datenbank anhängen, bevor Sie in Excel Berichte daraus erstellen.Wie kann ich Zeichen an eine Zeile in einer Datei anhängen?

Ich benutze Perl, um Daten aus der anderen Datenbank zu ziehen und möchte nur die zusätzlichen Spalten an das Ende jeder Zeile anhängen, während ich die Datei verarbeite.

Gibt es eine Möglichkeit, dies zu tun, ohne im Grunde eine neue Datei erstellen zu müssen? Die Grundstruktur ist:

foreach $line (@lines) { 
    my ($vars here....) = split (',',$line); 
    ## get additional fields 
    ## append new column data to line 
} 

Antwort

3

können Sie binden verwenden :: Datei (in dem Perl-Kern seit Perl 5.8) eine Datei in Position zu ändern:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Tie::File; 


my $file = shift; 

tie my @lines, "Tie::File", $file 
    or die "could not open $file: $!\n"; 

for my $line (@lines) { 
    $line .= join ",", '', get_data(); 
} 

sub get_data { 
    my $data = <DATA>; 
    chomp $data; 
    return split /-/, $data 
} 

__DATA__ 
1-2-3-4 
5-6-7-8 

Sie können auch in-Place-Bearbeitung mit den @ ARGV/< verwenden> Trick durch Einstellung $^I:

#!/usr/bin/perl 

use strict; 
use warnings; 

$^I = ".bak"; 

while (my $line = <>) { 
    chomp $line; 
    $line .= join ",", '', get_data(); 
    print "$line\n"; 
} 

sub get_data { 
    my $data = <DATA>; 
    chomp $data; 
    return split /-/, $data 
} 

__DATA__ 
1-2-3-4 
5-6-7-8 
+0

Die zweite Option funktioniert für mich, weniger Bibliotheken zum Download, etc. Auch eliminiert etwa 10 Zeilen aus meinem Code. – MattS

+0

Tie :: File ist seit 5.8 Teil von Core Perl (gut 5.7.3, aber das war eine dev Version). –

+0

Beachten Sie, dass diese funktionieren, solange keines der Felder im Datensatz vertikale Leerzeichen enthalten kann. Das hört sich blöd an, aber wenn Sie lange genug mit CSV spielen, werden Sie irgendwann jemanden treffen, der das macht. :) –

0

Betrachten Sie die -i Option <> Dateien an Ort und Stelle zu bearbeiten.

7

Sie könnten DBD::CSV betrachten, um die Datei so zu behandeln, als ob es eine Datenbank wäre (die auch Sonderzeichen für Sie behandeln würde).

1

Trotz aller netten Schnittstellen müssen Sie schließlich die Datei Zeile für Zeile lesen. Sie müssen möglicherweise sogar mehr tun, wenn einige zitierte Felder eingebettete Zeilenumbrüche enthalten können. Verwenden Sie etwas, das CSV kennt, um einige dieser Probleme zu vermeiden. Text::CSV_XS sollten Sie den meisten Ärger von seltsamen Fällen sparen.

Verwandte Themen