Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    Perl - Sostituzione Carattere

    Allora, ho un file testo.txt cosi strutturato

    ;10 ;DISPONIBILITA' IMP. FINAN ; ; ;
    ;10 ;DISPONIBILITA' IMP. FINAN ; ; ;
    ;10.10 ;CASSA E VALORI BOLLATI ; ; ;
    ;10.10 ;CASSA E VALORI BOLLATI ; ; ;
    ;10.10. 11;CASSA GENERALE ; ; ;
    ;10.10. 13;CASSA TEST ; ; ;
    ;10.10. 21;VALORI BOLLATI ; ; ;

    Ho provato a fare uno script che sostuisse, se il 4 carattere e' un ., lo stesso con ;
    ---------------------------------
    open (IN, "< testo.txt");
    open (OUT, "> testo.txt.new");

    while ($r = <IN>) {
    $f = substr( $r, 3, 1);
    if ($f eq ".") {
    $r =~ s/\./;/;
    print OUT $r;
    }
    }
    ---------------------------------

    Il file che crea ha il seguente output

    ;10 ;DISPONIBILITA' IMP. FINAN ; ; ;
    ;10 ;DISPONIBILITA' IMP. FINAN ; ; ;
    ;10;10 ;CASSA E VALORI BOLLATI ; ; ;
    ;10.10 ;CASSA E VALORI BOLLATI ; ; ;
    ;10;10. 11;CASSA GENERALE ; ; ;
    ;10;10. 13;CASSA TEST ; ; ;
    ;10;10. 21;VALORI BOLLATI ; ; ;

    Questa e' una porzione di testo, e' come se quando trova due righe uguali non le elabori, lasciandole uguali.
    Qualche idea?
    [CRY] - Counter-Strike clan! I want you!
    Sostenitore della teoria: ruttare e' umano ma scoreggiare e' divino.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Mi sembra un errore di logica. Non e` che volevi scrivere questo?
    codice:
    while ($r = <IN> ) {
      $f = substr( $r, 3, 1);
      if ($f eq ".") {
        $r =~ s/\./;/;
      }
      print OUT $r;
    }
    Che puo` essere scritto:
    codice:
    while ($r = <IN> ) {
      $r =~ s/^(.{3})\.(.+)$/$1;$2/; 
      print OUT $r;
    }
    PS. Non ricordo se davanti al ; della seconda parte della RE, e` necessario un backslash
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    soluzione splendida, ho provato, funziona come sintassi ma non risolve il problema.
    [CRY] - Counter-Strike clan! I want you!
    Sostenitore della teoria: ruttare e' umano ma scoreggiare e' divino.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Allora l'errore potrebbe essere un altro.
    Ad esempio:
    1. se in qualche riga c'e` un carattere non stampabile nei primi tre caratteri
    2. se vengono lette due righe di seguito (magari a causa di caratteri "strani" negli "acapo").

    Sarebbe bello vedere tutti i caratteri contenuti nel file, e verificare:
    a. come viene segnalato l'acapo
    b. se ci sono altri caratteri.

    Se hai un programmino che ti fa vedere il binario del file, risolvi con quello, altrimenti:
    codice:
    while ($r = <IN> ) {
      $r =~ s/^(.{3})\.(.+)$/$1;$2/; 
      print OUT $r;
      foreach $c in $r {printf OUT "%x ", $c; } print OUT "\n";
    }
    (spero di aver imbroccato la sintassi corretta - non ho verificato e sono un po' arrugginito)
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Hai ragione, sulle righe dove non sostituisce c'e' qualche problema, forse sull'andare acapo.
    Non si pou' includere un codice che aggiunga un acapo a fine riga se non c'e'?
    [CRY] - Counter-Strike clan! I want you!
    Sostenitore della teoria: ruttare e' umano ma scoreggiare e' divino.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Occorre prima definire cosa e` la "fine riga". I tre piu` diffusi sistemi (PC Win, Linux, Mac), usano tre codifiche diverse: rispettivamente: CR-LF (0d0a), LF(0a), CR(0d).

    Comunque se e` quello il problema, basta modificare la RE:
    /^\r?(.{3})\.(.+)$/$1;$2/

    Oppure essere un po' elastici nel conto dei caratteri (se possibile per il tipo di dati):
    /^([^\.]{2-4})\.(.+)$/$1;$2/

    Oppure essere elastici al massimo (questo forse e` troppo):
    /\./;/


    In alternativa si puo` trasformare tutte le coppie CR-LF in qualsiasi modo mescolate o dda sole in uno standard.
    Pero` allora occorer leggere prima tutto il file in una variabile, ed applicare questa RE:
    s/[\r\n]*/\n/gr (mi pare che sia /r per non considerare gli acapo)
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Partiamo dal presupposto che ho capito il 20% di quello che hai scritto....
    Il file proviene da un sistema unix. Ho provato ad applicare:
    ^\r?(.{3})\.(.+)$/$1;$2/
    Ma il problema continua ad esserci.
    Con s/[\r\n]*/\n/gr mi da un errore che viene dall'ultima r.
    Ho provato a guardare un po' di guide ma non ho trovato nessuna opzione che escludesse gli acapo.
    [CRY] - Counter-Strike clan! I want you!
    Sostenitore della teoria: ruttare e' umano ma scoreggiare e' divino.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Evidentemente non hai guardato il manuale.

    Ricorda che nei sistemi unix il manuale in linea e` fatto bene e completo.

    Quindi dai i comandi
    man perl
    (per il manuale generico sul perl - con riferimenti all'altra decina di manuali sul perl)
    man perlre
    (per il maunale delle RE)

    il carattere da inserire ( /x modifiers ) e` /s (non /r )
    Pero` devi avere tutto il file in una variabile, per cui non e` usabile immediatamente nel tuo script.

    Le altre proposte di RE che ti avevo indicato, le hai provate?
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Le altre alternative le ho provate ma sono andate tutte male.
    Il file risiede su unix, dove non c'e' perl ma solo il file. L'ho ricevo travite un programma telnet e lo elaboro con lo script in windows.
    [CRY] - Counter-Strike clan! I want you!
    Sostenitore della teoria: ruttare e' umano ma scoreggiare e' divino.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Originariamente inviato da Rabinhood
    Le altre alternative le ho provate ma sono andate tutte male.
    Tra le "alternative" ce n'e` una che dovrebbe stampare tutti i caratteri in esadecimale ... se non ho fatto errori; il codice che ottieni e` essenziale per capire come deve essere fatta la RE.


    Il file risiede su unix, dove non c'e' perl ma solo il file. L'ho ricevo travite un programma telnet e lo elaboro con lo script in windows.
    Riscrivo:
    Il file viene originato da un sistema unix, trasferito tramite telnet su un sistema windows e qui analizzato da Perl.
    E` questo che intendevi?

    Non ho esperienza di Perl sotto windows: so che ci sono delle differenze, ma non so se le RE sono completamente supportate. Dovresti trovare un manuale della tua implementazione di perl.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.