webForumDet fria alternativet

Ignorera rad i CSV-fil using fgetcsv

PHP

11 svar · 1 030 visningar · startad av elky

Medlem sedan feb. 201320 inlägg
Frågan#1

Hej jag använder fgetcsv för att läsa in en .csv-fil till min mysql-databas.

Filen innehåller på första raden kolumn rubrikerna som från början exporterades utifrån en excel-fil. Ett exempel på hur .csv-filen kan se ut har vi nedan:

"Namn", "Adress", "Telefonnummer"
"Karl Andersson","Stora gatan 3", "08-1232132"
"Johanna Svensson","Bagargränd 14","08-2312332"

Det jag vill åstadkomma är att första raden ignoreras, och informationen utan "-tecknen hamnar i databasen på smidigast tänkbara sätt. I övrigt är det önskvärt att en eventuell tom rad på slutet ej läses in, som det är nu hamnar en tom rad i tabellen vid inläsning, ifall en radbrytning finns efter sista raden i csv-filen.

Php-koden jag använder följer nedan:

 <?php 

//connect to the database
$connect = mysql_connect("localhost","user","user_pwd");
mysql_select_db("user_db",$connect); //select the table
//

if ($_FILES[csv][size] > 0) {

    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");

    //loop through the csv file and insert into database
    do {
           if ($data[0]) {
            mysql_query("INSERT INTO contacts (contact_first, contact_last, contact_email) VALUES
                (
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."'
                )
            ");
	 }

    } while ($data = fgetcsv($handle,1000,",","'"));
    //

    //redirect
    header('Location: import.php?success=1'); die;

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Importera CSV-fil i min MySQL</title>
</head>

<body>

<?php if (!empty($_GET[success])) { echo "<b>Filen har importerats korrekt.</b><br><br>"; } ?>

<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
  Choose your file: <br />
  <input name="csv" type="file" id="csv" />
  <input type="submit" name="Submit" value="Submit" />
</form>

</body>
</html>

Tack på förhand, E

Medlem sedan jan. 2005953 inlägg
#2

Kolla på exemplet i manualen. Där visas hur du håller reda på vilken rad i filen det är som behandlas. Om det är första raden, hoppa till nästa varv i loopen med continue

Medlem sedan feb. 201320 inlägg
#3

metalboy skrev:

Kolla på exemplet i manualen. Där visas hur du håller reda på vilken rad i filen det är som behandlas. Om det är första raden, hoppa till nästa varv i loopen med continue

Jag gjorde ett försök med just continue men den läste fortfarande in den första raden.

Medlem sedan jan. 2005953 inlägg
#4

Visa hur du har försökt

Medlem sedan feb. 201320 inlägg
#5

metalboy skrev:

Visa hur du har försökt

Jag gjorde en counter som jag sedan innan satte till värdet 0..

if($row == 0){ $row++; continue; }

Det borde enligt dokumentationen ha fungerat som önskat men ej.

Medlem sedan jan. 2005953 inlägg
#6

Och var har du lagt in denna kod?
Visa gärna hela koden för ditt försök.

Medlem sedan feb. 201320 inlägg
#7

Jag lade in den innan SQL-queryn, är det fel? Du får gärna lägga in den på rätt ställe annars ifall det är fel. Tack på förhand.

Medlem sedan juni 20019 519 inlägg
#8

Vad kommer $row ifrån?

Medlem sedan feb. 201320 inlägg
#9

voigtann1 skrev:

Vad kommer $row ifrån?

Det är en räknare jag har skapat tidigare, med värdet 0. Den finns ej med i koden ovan utan användes bara i ett försök att skippa första raden i csv-filen. När det ej fungerade återgick jag till min ursprungliga kod vilken jag postade ovan.

Medlem sedan feb. 201320 inlägg
#10

Jag läste denna artikel ang problemet:

skip-the-first-line-of-a-csv-file

men har ej lyckats implementera detta i min kod så att det fungerar tillfredställande.

Medlem sedan juni 20019 519 inlägg
#11

har knappt någon erfarenhet med php tycker det känns konstigt att $_FILES[csv] skulle fungera men:

<?php 

//connect to the database
$connect = mysql_connect("localhost","user","user_pwd");
mysql_select_db("user_db", $connect); //select the table
//

if ($_FILES[csv][size] > 0) {
    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");
	$row = 1;
    //loop through the csv file and insert into database
	while ($data = fgetcsv($handle,1000,",","'")){
		if($row == 1){ $row++; continue; }
		if ($data[0]) {
			mysql_query("INSERT INTO contacts (contact_first, contact_last, contact_email) VALUES
				(
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."'
                )
            ");
		}
    }
    //redirect
    header('Location: import.php?success=1'); die;
}
?>

kanske fungera?

Medlem sedan feb. 201320 inlägg
#12

Strålande, det fungerade perfekt och utskriften på skärmen som indikerade godkänd inläsning fungerade nu också, vilket den ej heller gjorde innan. Bugar och bockar!

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)