regels in bestand berekenen

Status
Niet open voor verdere reacties.

cyberexe

Gebruiker
Lid geworden
13 feb 2006
Berichten
144
hallo mensen,

ik heb een script waarmee ik een bestand tijdelijk opsla in een map.
ik dit bestand staan gegevens die ik later wil importeren in een database.
voordat ik de gegevens wil importeren wil ik het aantal regels in het bestand berekenen, zodat ik een while kan maken voor het importeren van de gegevens per regel.

ik heb dus het aantal regels, zodat de while weet hoevaal hij iets moet importeren.
het gaat hier vaak om een bestand met wel 1400 regels.

kan iemand mij hierbij helpen??

alvast bedankt!
 
Je zou misschien de inhoud van de tekst kunnen splitten op "\n" (nieuwe regel) en dan die array doorlopen?

Edit: en waarom wil je regel voor regel in de database zetten en niet direct de hele inhoud?
 
omdat dit allemaal misschien via een website gaat gebeuren en niet direct vanaf een server.
en het is vaak meer dan 250 mb data... dat gaat niet goed.

dat moet dan met behulp van een array... en dat moet niet.
is er geen code die gelijk berekend hoeveel regels erin zitten?
 
Laatst bewerkt:
Meer dan 250mb :shocked:, hoelang denk je dat hij daar mee bezig is...

Maar goed:
PHP:
?php
// Get a file into an array.  In this example we'll go through HTTP to get
// the HTML source of a URL.
$lines = file('http://www.example.com/');

// Loop through our array, show HTML source as HTML source; and line numbers too.
foreach ($lines as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

// Another example, let's get a web page into a string.  See also file_get_contents().
$html = implode('', file('http://www.example.com/'));
?>
Van de PHP-site, voorbeeld 1.

Feitelijk heb je alleen dit maar nodig:
PHP:
$bestand = file('bestand.html');
$regels = count($bestand);
Let wel, file haalt de bron-code van de output. PHP-code wordt dus niet weergegeven.
 
ok... het tellen werkt.
alleen krijg nu het volgende probleem....

ik moet de while functie telkens $i opvoeren met 1 regel.
$i is de begin regel. opvoeren met 1 is:

PHP:
$i++

nu moet ik dit combineren met de while functie.
ik weet dat de while zo niet werkt, maar ik zou het niet weten.
het bestand heeft 15 velden.
deze is tot nu toe zo ver:

PHP:
 $todo = 'INSERT INTO `eurailscout`.`gegevens` (`id` ,`lat` ,`long` ,`alt`)';
    
while($i++) {
list($A, $B, $C, $D, $E, $F, $G, $H, $I, $J, $K, $L, $M, $N, $O) = explode(',', $array[$i]);  
		//$data = explode(";", $array[$i]);
		if($i == 0) 
		{
		$end = 'VALUES ';
		} 
		else 
		{
		$end = ',';
		}				
		$i++;

				
$todo .= $end."(NULL , '".$C." ".$D."', '".$E." ".$F."', '".$J." ".$K."')";
		}
				
$todo .= ';';
echo '<br><b>er zijn in totaal '.$i.' regels geimporteerd.</b><br>';
$nmea2mysql = mysql_query($todo, $connect) or die(mysql_error());

weet iemand misschien hier ook een oplossing voor??
 
Laatst bewerkt:
Je moet de stopconditie in de while zetten.

Je wilt dat hij doorgaat tot $i, dus moet je eerst een controle variabele aanmaken. Het is niet echt handig om het totaal aan regels in $i te zetten. Die variabele zegt niet zo veel over de inhoud en het is handiger om $i voor de while te gebruiken.

PHP:
$numRegels = count($bestand);

while($i < $numRegels) {
  // Troep uitvoeren

  // Controle variabele verhogen.
  $i++;
}
 
dus dan komt het er zo uit te zien:

PHP:
$lokatie = "C:/wamp/www/eurailscout/".$basedir.$file;
    
    $bestand = file($lokatie); 
	$regels = count($bestand); 
    
    $i = 1;
    $todo = 'INSERT INTO `eurailscout`.`gegevens` (`id` ,`lat` ,`long` ,`alt`)';
    
	while($i < $regels) { 
				{
				//regels 
				list($A, $B, $C, $D, $E) = explode(',', $array[$i]);
				//$data = explode(";", $array[$i]);
				if($i == 0) 
					{
					$end = 'VALUES ';
					} 
				else 
					{
					$end = ',';
					}				
				$i++;

				echo 'Regel '.$i.' -- '.$A.' '.$B.' '.$C.' '.$D.' '.$E.'<br>';
				//$todo .= $end."(NULL , '".$C." ".$D."', '".$E." ".$F."', '".$J." ".$K."')";

				//echo 'Regel '.$i.' -- Kolom A: '.$data[0].' -- Kolom B: '.$data[1].' -- Kolom C: '.$data[2].' -- Kolom D: '.$data[3].'<br>';
				}
				echo $regels;
		//	$todo .= ';';
			echo '<br><b>er zijn in totaal '.$regels.' regels geimporteerd.</b><br>';
		//	$nmea2mysql = mysql_query($todo, $connect) or die(mysql_error());
  }
  }
 
Zou best kunnen, jij zal het beter weten dan ik aangezien jij het bestand kan testen :)
 
dit is wat ik nu heb...
alleen hij kapt ermee na regel 3.
volgens mij vind ie het niet leuk als ie telkens 1 bij $i moet optellen.

PHP:
class eurailscout {

    function nmea($tmp_location,$file_name)
    {
        $handle = fopen($tmp_location.$file_name, "r");

        if ($handle) 
			{
				
			$bestand = file($tmp_location.$file_name); 
			$regels = count($bestand);

			require("connect.php");
			$i = 0;
			//$todo = 'INSERT INTO `eurailscout`.`gegevens` (`id` ,`lat` ,`long` ,`alt`)';

			while($i <= $regels) 
				{
				$array = explode("\n", fread($handle, filesize($file_name)));
				print_r($array);
				list($A, $B, $C, $D, $E) = explode(",", $array[$i]);  
				//$data = explode(";", $array[$i]);
				if($i == 0) 
					{
					$end = 'VALUES ';
					} 
				else 
					{
					$end = ',';
					}				
				$i++;

				echo 'Regel '.$i.' -- '.$A.' '.$B.' '.$C.' '.$D.' '.$E.'<br>';
				//$todo .= $end."(NULL , '".$B."', '".$C."', '".$E."')";

				//echo 'Regel '.$i.' -- Kolom A: '.$data[0].' -- Kolom B: '.$data[1].' -- Kolom C: '.$data[2].' -- Kolom D: '.$data[3].'<br>';
				}
			//$todo .= ';';
			echo '<br><b>er zijn in totaal '.$i.' regels geimporteerd.</b><br>';
			}

		//$nmea2mysql = mysql_query($todo, $connect) or die(mysql_error());
	}

    function upload($old_file,$new_file,$tmp_path)
    {
        $file_name = $old_file["name"];
        $file_name = stripslashes($file_name);
        $file_name = str_replace("","",$file_name);
        $new_file = $new_file.".csv" ;
        $copy = copy($old_file["tmp_name"] , $tmp_path.$new_file);
        $this->nmea($tmp_path,$new_file);
    }

}

?>

weet iemand misschien hoe ik 1 regel uit een bestand kan inlezen en laten importeren?
nu pak ik namelijk nogsteeds een heel bestand.
 
Tja dat wordt lastig aangezien het hele bestand bekend moet zijn wil er een regel uit kunnen worden gehaald.

Wat je nu doet is gewoon regel voor regel het bestand doorlezen.

Het ligt niet aan $i aangezien een WHILE-lus (en ook een FOR) zo zijn opgebouwd.

Laat hem anders een gewoon alle regels uitprinten zonder dat er wat mee wordt gedaan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan