Visualizzazione dei risultati da 1 a 6 su 6

Discussione: File Testo e Linux

  1. #1

    File Testo e Linux

    GoodWeb

    Ho un problema con la lettura di file testo con Linux e non con Windows !!!
    La cosa strana è che apparentemente funge, ma solo la lettura del primo record.
    Sicuramente ho sbagliato io in qualche cosa, ma sinceramente non capisco o trovo dove....

    Le stesse procedure utilizzate su Windows XP e PHP 5 (in locale) e su server Win2000 e PHP 4 funzionano bene, viceversa installate su server Linux (CentOS) no..

    Illustro brevemente gli script utilizzati:
    Parte dove definisco la struttura dei DB FlatFile
    Estensione file, delimitatore di campo, delimitatore di record, delimitatore array e tipo di campo gestito
    Struttura del DataBase
    Codice PHP:
    //-- define dir where db will be stored
    DEFINE ('DB_DIR',PATH_SITE."_db");

    //-- define db file extension
    DEFINE ('DB_FILE_EXT','txt');

    //-- define db field delimiter
    DEFINE ("DB_FIELD_DELIMIT",';§;');

    //-- define db record delimiter
    DEFINE ("DB_RECORD_DELIMIT",';§§');

    //-- define db record delimiter
    DEFINE ("DB_ARRAY_DELIMIT",'#||#');

    //-- define the data types
    DEFINE ('DB_TYPE_ID','id');
    DEFINE ('DB_TYPE_STRING','string');
    DEFINE ('DB_TYPE_TEXT','text');
    DEFINE ('DB_TYPE_ARRAY','array');

    //-- define db structure (for each table field name => field type)
    $_db_structure = array
    (
        
    'menu' => array (
                
    'menu_id' => DB_TYPE_ID,
                
    'menu_name' => DB_TYPE_STRING,
                
    'menu_title' => DB_TYPE_TEXT,
                
    'menu_type' => DB_TYPE_ID,
                
    'menu_link' => DB_TYPE_STRING
                
    ),
    ..... 
    La funzione che legge il file è la seguente:
    Codice PHP:
    <?
    ...
    function 
    db_read($db_table)
    {
        global 
    $_db_structure;

        
    //-- the records will be added into this array
        
    $a_record = array();
        
    $db_filename DB_DIR.'/'.$db_table.'.'.DB_FILE_EXT//-- database filename

        //-- check if the database file exists
        
    if (file_exists($db_filename) and filesize($db_filename) > 0)
        {
              
    //-- read the database
            
    $handle fopen($db_filename'r');
            
    $contents fread($handlefilesize($db_filename));
            
    fclose($handle);

            
    //-- get the lines
            
    $a_lines explode(DB_RECORD_DELIMIT."\r\n",$contents);
            
    $i_record 0//-- record count
            
    for ($i=0;$i<count($a_lines);$i++)
            {
                if (!empty(
    $a_lines[$i]))
                {
                    
    $a_line explode(DB_FIELD_DELIMIT,$a_lines[$i]); //-- get the record line
                    
    $i_field=0;//-- field count

                    
    foreach ($_db_structure[$db_table] as $str_field=>$str_type)
                    {
                        
    stampo la mia tabella
                    
    }
                    
    $i_record++;
                }
    //-- if
            
    }//-- for
        
    }
        
    //-- return the record
        
    return $a_record;
    }
    ...
    ?>
    Sembra che con linux la mia procedura non sia in grado di capire o leggere la fine dei record
    Codice PHP:
    .... $a_lines explode(DB_RECORD_DELIMIT."\r\n",$contents); ...... 
    infatti a video tramite un print_r dell'array mi ritorna il primo record completo e suddiviso, ma alla fine dello stesso mi ritrovo:
    campo;§§\n 2
    dove campo è effettivamente l'ultimo campo del record,
    ;§§ è il delimitatore di record come impostato
    e 2 è l'id di partenza del secondo record.....

    Suggerimenti !!
    Grazie 1000 a tutti per l'interesse
    olGerva | Internet: la libertà di scrivere porta al sapere di molti
    http://www.slypage.com - http://www.wire-net.it

  2. #2
    Utente di HTML.it L'avatar di ZaK78
    Registrato dal
    Dec 2000
    Messaggi
    35
    prova ad utilizzare solo "\n" invece di "\r\n".

    In ambiente dos/Windows un file di testo finisce una riga con un carattere di carriage return (CR) e un carattere di LineFeed (LF).
    In ambiente *nix si utilizza solo il LineFeed.

    Saluti
    Rox

  3. #3
    Originariamente inviato da ZaK78
    prova ad utilizzare solo "\n" invece di "\r\n".

    In ambiente dos/Windows un file di testo finisce una riga con un carattere di carriage return (CR) e un carattere di LineFeed (LF).
    In ambiente *nix si utilizza solo il LineFeed.

    Saluti
    Rox
    IMMENSAMENTE GRAZIE 1.000.000

    Ci stavo arrivando, anche solo per come ho visto la stampa di print_r ..... e la fine anomala del record, imputabile o alla gestione da parte dello script sulla fine del record stesso o alla gestione differente del sistema operativo, come del resto tu mi hai confermato.
    Ancora GRAZIE
    olGerva | Internet: la libertà di scrivere porta al sapere di molti
    http://www.slypage.com - http://www.wire-net.it

  4. #4
    se nell'fopen utilizzi, oltre al tag r, anche il tag t se ne occupa lui da solo.

    In ogni caso, non è importante che il file venga letto su linux, infatti non vi è alterazione del file durante la lettura! Scoppierebbe tutto se solo perché un file viene spostato da un sistema ad un altro vengono modificati gli eol (end of line).

    Inoltre puoi utilizzare la costatne PHP_EOL che in automatico è impostata da php in base al sistema operativo

    Se usi sia il flag t nell'fopen sia PHP_EOL dovresti essere apposto

    www.php.net/fopen

  5. #5
    GRAZIE
    Ottima soluzione, di cui non ne conoscevo l'esistenza PHP_EOL

    Viceversa il tag \t che mi dici non trovo traccia su PHP

    Grazie
    olGerva | Internet: la libertà di scrivere porta al sapere di molti
    http://www.slypage.com - http://www.wire-net.it

  6. #6
    GoodWeb

    In merito al tuo suggerimento passato, peraltro molto utile, oggi ho avuto la necessità di modificare alcune cose e rileggendo meglio le info su PHP ho anche trovato il famoso flag t
    Volevo chiedere però se il parametro PHP_EOL lo devo usare solo per la lettura o anche in scrittura. I due sistemi procedono automaticamente ... Giusto?

    In effetti mi ritrovo un file che in alcuni casi termina con il classico \r\n "senza vedere nulla" in Windows e con Linux oltre al mio \r\n mi appare a fine linea un "quadratino"
    Leggendo il file nei due sistemi cmq tutto funge.

    Grazie

    Originariamente inviato da daniele_dll
    se nell'fopen utilizzi, oltre al tag r, anche il tag t se ne occupa lui da solo.

    In ogni caso, non è importante che il file venga letto su linux, infatti non vi è alterazione del file durante la lettura! Scoppierebbe tutto se solo perché un file viene spostato da un sistema ad un altro vengono modificati gli eol (end of line).

    Inoltre puoi utilizzare la costatne PHP_EOL che in automatico è impostata da php in base al sistema operativo

    Se usi sia il flag t nell'fopen sia PHP_EOL dovresti essere apposto

    www.php.net/fopen
    olGerva | Internet: la libertà di scrivere porta al sapere di molti
    http://www.slypage.com - http://www.wire-net.it

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 © 2024 vBulletin Solutions, Inc. All rights reserved.