Schrift
[thread]7806[/thread]

CSV-Dateien in .txt



<< >> 7 Einträge, 1 Seite
datenreisender
 2006-03-19 12:18
#63882 #63882
User since
2006-03-19
6 Artikel
BenutzerIn
[default_avatar]
hallo leute,
ich habe eine datei mit mehreren nummern, namen, adressen usw.
zb:
1; Andreas Huber;   Liststrasse 8;
1; Klaus Huber;       Liststrasse 8;
2; Harald Gaertner;  Oskarstrasse 11;
2; Sarah Gaertner;   Oskarstrasse 11;
2; Michael Gaertner; Oskartstrasse 11;
Diese schreibe ich in getrennte csv-dateien in tmp.
also entsteht dann eine 1.csv und eine 2.csv ... 1. csv enthaelt dann eben 2 datensaetze, 2.csv 3 datensaetze.
nun will ich alle abarbeiten und daraus txt erezugen (mit den formatierten inhalten der csv-dateien).

ich habe folgenden code dazu geschrieben:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#/usr/bin/perl 

chdir "tmp";
my @csv_dateien = glob "*.csv";
$text="irgendein text";

$zaehl = 0;
$i=0;
$pruef = 0;
$x = -1;
$a = 2;
$kontrolle = 0;
for(@csv_dateien)
{
 
 $zaehler = -1;
 
if(!-e @csv_dateien[$zaehl] . ".txt")
   {

   if($pruef == 0)
    {
   
    &ausgabe();
}
 
   }
$zaehl++;
#$pruef++;
}
############################################################################
sub ausgabe {


     open DATEN, @csv_dateien[$zaehl] or die "Fehler beim Oeffnen der Datei";
     open(FILE, ">>" . @csv_dateien[$zaehl] . ".txt");
      while(<DATEN>)
       {
 push(@zeilen,$_);
}

for(@zeilen)
 {
 $i++;
 $zaehler++;
 
 if($zaehler == 0)
   {
   
    print FILE substr(@zeilen[$i],10, 30);
    print FILE "\n";
print FILE substr(@zeilen[$i],41, 7);
print FILE " ";
print FILE substr(@zeilen[$i],49, 25);
print FILE "\n";
print FILE substr(@zeilen[$i],75, 25);
print FILE "\n\n\n\n\n";
print FILE $text;
printf FILE "%-8s", "Traeger-Nr.";
printf FILE "%-16s", "      Name";
printf FILE "%-36s", "        Fehlteil";
printf FILE "%-13s", "        Ident-Nr.";
print FILE "\n";
  }
  if(substr(@zeilen[$i],101, 6) != 0)
   {
 printf FILE "%04d",substr(@zeilen[$i],101, 6) . "  ";
  }
printf FILE "%4s", "    ";
print FILE " ";
printf FILE "%21s", substr(@zeilen[$i],108, 15);
    print FILE " ";
printf FILE "%32s", substr(@zeilen[$i],131, 30);
print FILE " ";
printf FILE "%13s", substr(@zeilen[$i],199, 11);
 
 }

}

die erste und zweite csv werden noch korrekt in txt umgewandelt .. dann allerdings wird nur mehr der text angezeigt. ich weiß leider nicht was ich falsch mache ;-(
Bitte um hilfe.

lg datenreisender
GwenDragon
 2006-03-19 13:46
#63883 #63883
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Webb du mit CSV-Dateien arbeiten willst, empfehle ich CPAN:Text::CSV\n\n

<!--EDIT|GwenDragon|1142932499-->
renee
 2006-03-19 20:47
#63884 #63884
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Im Wiki ist auch ein Snippet, wie man aus einer CSV-Datei eine XML-Datei machen kann. Das kann man dann noch anpassen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FIFO
 2006-03-20 00:37
#63885 #63885
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hm, etwas "zu Fuß" gedacht, der Code ...
Was jedenfalls so nicht funktioniert, ist der Zugriff auf die Array-Elemente:
Code: (dl )
 if(!-e @csv_dateien[$zaehl] . ".txt")    # falsch

... und weiter unten genauso ("@zeilen[$i]...").
Ein Array-Element ist ein Skalar, du musst $csv_dateien[$zaehl] verwenden.
Außerdem solltest du dich mal mit der for-Schleifensyntax befassen, dann kannst du die manuelle Zählerkontrolle einsparen:
Code: (dl )
1
2
3
4
for my $zeile (@zeilen) {
# was jetzt in $zeile steht, entspricht dem,
# was du mit @zeilen[$i] meinst
}


... und dann gibts noch Vereinfachungen, die die Lesbarkeit erhöhen, z.B.
Code: (dl )
1
2
3
4
5
6
7
8
while(<DATEN>)
{
push(@zeilen,$_);
}

# ist dasselbe wie:

my @zeilen = <DATEN>;


Generell: 'use strict; use warnings;' am Anfang hat schon so manchen gerettet ;-)

Good Luck!
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
jan
 2006-03-20 01:06
#63886 #63886
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=GwenDragon,19.03.2006, 12:46]Webb du mit CSV-Dateien arbeiten willst, empfehle ich CPAN:Text::CSV[/quote]
und ich CPAN:Text::CSV_XS, das ist etwas schneller und vor allem flexibler.\n\n

<!--EDIT|jan|1142809685-->
GwenDragon
 2006-03-21 11:15
#63887 #63887
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
datenreisender
 2006-03-21 13:48
#63888 #63888
User since
2006-03-19
6 Artikel
BenutzerIn
[default_avatar]
Vielen Dank!

haut inzwischen hin.


lg Matthi
<< >> 7 Einträge, 1 Seite



View all threads created 2006-03-19 12:18.