# CSV einlesen



## Sara456 (23. Mai 2014)

Ich fange erstmal mit einlesen ein bevor ich die überprüfungen mache
Also ich habe eine CSV-Input Datei, das wie folg aussieht
Input.csv:
12;;654;Test;12345;Test
13;;265;Test;12345;Test
Mapping_CSV: ! ist dafür da, da die Stelle 2 in der Input_Datei leer ist.
Stelle Ziel_Stelle Laenge Typ
1 1 5 Numerisch
! 2 6 Numerisch
3 3 9 Numerisch
4 4 14 Alphanumerisch
5 5 5 Numerisch
6 6 28 Alphanumerisch
7 7 14 Alphanumerisch


```
#!C:/Programme/Perl
 
use strict;
my $input='Input.csv';
my $output='Output.csv';
my $mapping='Input_mapping.csv';
my $zeileDaten;
my @arrayDaten;
my $inputDaten;
my @inputarray;
my $semikolon=';';
 
open MAPPING, "<$mapping" or die "Datei $mapping konnte nicht geöffnet werden";
open INPUT, "<$input" or die "Datei $input konnte nicht geöffnet werden";
open Output, ">$output" or die "Datei $output konnte nicht geöffnet werden";
while (<MAPPING>){
chomp;
 
#print "$_\n";
 
$zeileDaten ="$_\n";
 
 
push(@arrayDaten,$zeileDaten);
}
 
close(MAPPING);
 
while (<INPUT>){
chomp;
$inputDaten ="$_\n";
@inputarray=split(/;/,$inputDaten);
foreach $mapping( @arrayDaten ) {
my ($Stelle, $ZielStelle,$Laenge, $Typ) = split(/;/,$mapping);
if ($Stelle eq "!"){
print Output "$semikolon";
} else {
print Output "@inputarray[$Stelle]$semikolon";
print "@inputarray[$Stelle]$semikolon";
}
 
 
}
 
 
}
close(INPUT);
```
Als Output erhalte ich nicht, was ich in Input hatte
Meine Output csv: Das verschiebst sich alles
12;2654; Test;Test Str:1;12345;Test
;;13;26542;;Test;Test Str:2;12345;Test
;;14;264624;;Test;Test Str:3;12345;Test


----------



## saftmeister (23. Mai 2014)

Hallo,

zunächst empfehle ich, die wirklich mächtige CPAN-Bibliothek nach Lösungen oder Hilfestellungen zu durchsuchen. Ich hab das hier gefunden

https://metacpan.org/pod/Text::CSV

Folgende Kommando-Zeilen-Befehle; Windows => cmd, Linux => irgend eine Terminal-Software:


```
c:\> cpan
cpan> install Text::CSV
```

Dann gehen so tolle Sachen:


```
use strict;
use warnings;

use Text::CSV;

my $file = "input.csv";
open my $fh, "<", $file or die "$file: $!";

my $csv = Text::CSV->new ({
  binary  => 1,
  auto_diag => 1,
  sep_char  => ';',
});

while (my $row = $csv->getline ($fh)) {
  print "@$row\n";
}

close $fh;
```

Statt "print @$row" kannst du bspw. auch "print $row->[0]" notieren und damit auf das erste Element in der Zeile zugreifen. Und falls du auch schreiben willst, dass geht auch. Versuch es erstmal selbst (auch anhand der Doku und stöbern im Netz), wenn du nicht weiter kommst, frag ruhig noch mal nach.


----------

