Thread Datei einlesen (38 answers)
Opened by Fredl at 2012-03-09 15:50

topeg
 2012-03-22 13:57
#157000 #157000
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Hier ein Beispiel wie man es machen kann. Ich setze den LineInputSeparator neu um mir Die Blöcke zu holen, die alle wichtigen Informationen haben. Dann schreibe ich jeden Block gewünschte male. Bei jeden Block suche ich die Zahlen, die ersetzt werden sollen und schreibe den den richtigen Wert dort hin, welchen ich aus der gelesenen Zahl und und dem aktuellen Zähler errechne.

more (9.5kb):
Code (perl): (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
#!/usr/bin/perl

use strict;
use warnings;

my $file_in='test.data.txt';
my $file_out='test.data.out.txt';

my $separator="\n# TIME STEP ";
my $count=24;

my @blocks;

# lokalen Gültigkeitsbereich erzeugen
{
  open(my $fh_in,  '<', $file_in)  or die("Error open $file_in ($!)\n");

  # setze Zeilentrenner neu
  local $/=$separator;
  # nun wird nur noch an "\n#TIME STEP " getrennt,

  # blöcke einlesen
  @blocks=<$fh_in>;

  # zeilentrenner "\n# TIME STEP " entfernen,
  # da sie am ende das Blockes stehen
  # und nicht am anfang
  chomp(@blocks);

  close($fh_in);
}

{
  open(my $fh_out, '>', $file_out) or die("Error open $file_out ($!)\n");

  # den Kopf des Dokumentes übernnehmen
  print $fh_out shift(@blocks);

  # Jeden Block durch gehen
  for my $block_in (@blocks)
  {
    # 24 durchläufe
    for my $nr (1..$count)
    {
      # kopie erstellen
      my $block_out=$block_in;

      # die Nummer von "# TIME STEP <Nummer>" finden und ersetzen
      # duch das trennen der Blöcke steht die nummer nun ganz am Anfang.
      # Mit "sprintf" die Ausgabe formatieren
      # aus 1 wird 01 aus 2 => 02 aus 11 => 11 usw.
      # die Option "e" führt den Ersetzungsteil als perl aus.
      $block_out=~s/^\s*(\d+)/sprintf('%02u',($1-1)*$count+$nr)/e;

      # das 'ts<Nummer>' suchen und ersetzen
      $block_out=~s/'ts(\d+)'/sprintf("'ts%02u'",($1-1)*$count+$nr)/e;

      # "# TIME STEP <Nummer>"
      # und den veränderten Inhalt in die neue Datei schreiben.
      print $fh_out $separator.$block_out
    }
  }

  close($fh_out);
}


Getestet hier mit:
more (1.2kb):
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
# Schedule name
'STEPS_1&UP'
#
# TIME STEP 1
# DATA Set 2: identifier and counts
# BCSID NSOP1 NSOU1 NPBC1 NUBC1
'ts01' 0 0 22 0
# Data Set 3: fluid source/sinks
# IQP1 QINC1 UINC1
1,0
1,0
1,0
0
#
# TIME STEP 2
# DATA Set 2: identifier and counts
# BCSID NSOP1 NSOU1 NPBC1 NUBC1
'ts02' 0 0 22 0
# Data Set 3: fluid source/sinks
# IQP1 QINC1 UINC1
2,0
2,0
2,0
0
#
# TIME STEP 3
# DATA Set 2: identifier and counts
# BCSID NSOP1 NSOU1 NPBC1 NUBC1
'ts03' 0 0 22 0
# Data Set 3: fluid source/sinks
# IQP1 QINC1 UINC1
3,0
3,0
3,0
0
#

View full thread Datei einlesen