Sortera upp rader i flera filer

Permalänk
Medlem

Sortera upp rader i flera filer

Hej! Har ett litet problem som jag fastnat lite på, har ett antal rader som jag vill dela upp på flera filer, men får inte riktigt till det i min kodning

Vi säger att det är 100 rader så får det bara bara 37 rader i varje fil som skapas, dvs cirka 4 filer eller vad det blir då, att skapa första filen är ju inga problem, men efter dom första 37 raderna, hur ser jag till att den tar efterkommande 37 och lägger i *-fil2.csv och så vidare tills alla rader är uppdelade på rätt antal filer.

Tack på förhand!

(PHP)

Visa signatur

| AMD Athlon 64 3800+ , MSI K9N PLATINUM nForce570 (AM2) , 250+300GB SATAII , Geforce 6600GT 128MB Silent Pipe (PCI-Express) , 1024GB DDR2 PC-5300 667MHz , Hyndai 17" 12ms |
LG W1-D2RLV , Intel® Core™2 Duo T5600 (1.83GHz) ,1GB DDR II, Radeon® X1600, 120GB SATA |

Permalänk
Medlem

Jag skulle dela upp strängen till en array med rader, och iterera igenom varje rad med en räknare som håller koll på när antal rader uppgått till 37 så öppnar man nästa fil för skrivning. Använd fwrite.

Permalänk
Medlem

Jo som iSimon säger jag skulle också pressa in allt i en Array, och sen skulle jag räkna elementen och dela med antalet filer jag vill ha. Och sätta detta värde som räknare.

Visa signatur

Ei bor i stockholm och tar inget ansvar för allt som han säger
i5 2500k, 16 gig ram, radeon 6950
Solna arbetscenter

Permalänk
Medlem

Idag ser koden ut såhär:

$query = mysql_query("SELECT korjournal.date, korjournal.kund_id, korjournal.kund, korjournal.postort, korjournal.start, korjournal.stop, korjournal.service_id, korjournal_users.user FROM korjournal INNER JOIN korjournal_users ON korjournal.user_id = korjournal_users.id WHERE korjournal.bil_id = ".$bil." AND korjournal.date BETWEEN '".$period."-01' AND '".$period."-31' ORDER BY stop ASC "); $count=mysql_num_rows($query); $content = ""; while($row = mysql_fetch_Array($query)){ $kund_id = ""; $service_id = ""; if($row["kund_id"] == "0"){ $kund_id = ""; } else { $kund_id = $row["kund_id"]; } if($row["service_id"] == "0"){ $service_id = ""; } else { $service_id = $row["service_id"]; } $content. = $row["date"].",".$kund_id.",".$row["kund"].",".$row["postort"].",".$row["start"]. ",".$row["stop"].",,,".$service_id.",".$row["user"]."\n"; } echo "<a href='?do=home'><button>Tillbaka</button></a><br><br>"; echo "<fieldset><legend>Generera rapport</legend>"; $_file = "_journaler/".$bilnamn."_korjournal_".$period.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle);

Och sen när den kört klart så slänger den in värdet av $content. i filen som jag öppnar.

Men vill helldre ha det så att den gör sådär med max 37 rader och sen skapar nästa fil som heter fil2.csv och fyller den med så många som finns kvar, dock max 37 osv till den är klar.

Visa signatur

| AMD Athlon 64 3800+ , MSI K9N PLATINUM nForce570 (AM2) , 250+300GB SATAII , Geforce 6600GT 128MB Silent Pipe (PCI-Express) , 1024GB DDR2 PC-5300 667MHz , Hyndai 17" 12ms |
LG W1-D2RLV , Intel® Core™2 Duo T5600 (1.83GHz) ,1GB DDR II, Radeon® X1600, 120GB SATA |

Permalänk
Medlem
Skrivet av jwradhe:

Idag ser koden ut såhär:

$query = mysql_query("SELECT korjournal.date, korjournal.kund_id, korjournal.kund, korjournal.postort, korjournal.start, korjournal.stop, korjournal.service_id, korjournal_users.user FROM korjournal INNER JOIN korjournal_users ON korjournal.user_id = korjournal_users.id WHERE korjournal.bil_id = ".$bil." AND korjournal.date BETWEEN '".$period."-01' AND '".$period."-31' ORDER BY stop ASC "); $count=mysql_num_rows($query); $content = ""; while($row = mysql_fetch_Array($query)){ $kund_id = ""; $service_id = ""; if($row["kund_id"] == "0"){ $kund_id = ""; } else { $kund_id = $row["kund_id"]; } if($row["service_id"] == "0"){ $service_id = ""; } else { $service_id = $row["service_id"]; } $content. = $row["date"].",".$kund_id.",".$row["kund"].",".$row["postort"].",".$row["start"]. ",".$row["stop"].",,,".$service_id.",".$row["user"]."\n"; } echo "<a href='?do=home'><button>Tillbaka</button></a><br><br>"; echo "<fieldset><legend>Generera rapport</legend>"; $_file = "_journaler/".$bilnamn."_korjournal_".$period.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle);

Och sen när den kört klart så slänger den in värdet av $content. i filen som jag öppnar.

Men vill helldre ha det så att den gör sådär med max 37 rader och sen skapar nästa fil som heter fil2.csv och fyller den med så många som finns kvar, dock max 37 osv till den är klar.

jag skulle gjort något liknande fast byggt skapa fil koden som en funktion så den slipper ligga på 2 ställen:

$query = mysql_query("SELECT korjournal.date, korjournal.kund_id, korjournal.kund, korjournal.postort, korjournal.start, korjournal.stop, korjournal.service_id, korjournal_users.user FROM korjournal INNER JOIN korjournal_users ON korjournal.user_id = korjournal_users.id WHERE korjournal.bil_id = ".$bil." AND korjournal.date BETWEEN '".$period."-01' AND '".$period."-31' ORDER BY stop ASC "); $count=mysql_num_rows($query); $content = ""; $count = 0; $round = 1; while($row = mysql_fetch_Array($query)){ $kund_id = ""; $service_id = ""; if($row["kund_id"] == "0"){ $kund_id = ""; } else { $kund_id = $row["kund_id"]; } if($row["service_id"] == "0"){ $service_id = ""; } else { $service_id = $row["service_id"]; } $content. = $row["date"].",".$kund_id.",".$row["kund"].",".$row["postort"].",".$row["start"]. ",".$row["stop"].",,,".$service_id.",".$row["user"]."\n"; $count++; if($count == 37) { $_file = "_journaler/".$bilnamn."_korjournal_".$period.$round.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle); $count = 0; $round++; $content = ""; } } echo "<a href='?do=home'><button>Tillbaka</button></a><br><br>"; echo "<fieldset><legend>Generera rapport</legend>"; if($count > 0) { $_file = "_journaler/".$bilnamn."_korjournal_".$period.$round.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle); }

Permalänk
Medlem
Skrivet av jonke:

jag skulle gjort något liknande fast byggt skapa fil koden som en funktion så den slipper ligga på 2 ställen:

$query = mysql_query("SELECT korjournal.date, korjournal.kund_id, korjournal.kund, korjournal.postort, korjournal.start, korjournal.stop, korjournal.service_id, korjournal_users.user FROM korjournal INNER JOIN korjournal_users ON korjournal.user_id = korjournal_users.id WHERE korjournal.bil_id = ".$bil." AND korjournal.date BETWEEN '".$period."-01' AND '".$period."-31' ORDER BY stop ASC "); $count=mysql_num_rows($query); $content = ""; $count = 0; $round = 1; while($row = mysql_fetch_Array($query)){ $kund_id = ""; $service_id = ""; if($row["kund_id"] == "0"){ $kund_id = ""; } else { $kund_id = $row["kund_id"]; } if($row["service_id"] == "0"){ $service_id = ""; } else { $service_id = $row["service_id"]; } $content. = $row["date"].",".$kund_id.",".$row["kund"].",".$row["postort"].",".$row["start"]. ",".$row["stop"].",,,".$service_id.",".$row["user"]."\n"; $count++; if($count == 37) { $_file = "_journaler/".$bilnamn."_korjournal_".$period.$round.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle); $count = 0; $round++; $content = ""; } } echo "<a href='?do=home'><button>Tillbaka</button></a><br><br>"; echo "<fieldset><legend>Generera rapport</legend>"; if($count > 0) { $_file = "_journaler/".$bilnamn."_korjournal_".$period.$round.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle); }

Men vi säger att det blir 2 fulla filer med 37 i varje, och det blir 14 över, då skrivs dom inte till fil 3? eftersom den kollar == 37 ?

Visa signatur

| AMD Athlon 64 3800+ , MSI K9N PLATINUM nForce570 (AM2) , 250+300GB SATAII , Geforce 6600GT 128MB Silent Pipe (PCI-Express) , 1024GB DDR2 PC-5300 667MHz , Hyndai 17" 12ms |
LG W1-D2RLV , Intel® Core™2 Duo T5600 (1.83GHz) ,1GB DDR II, Radeon® X1600, 120GB SATA |

Permalänk
Medlem
Skrivet av jwradhe:

Men vi säger att det blir 2 fulla filer med 37 i varje, och det blir 14 över, då skrivs dom inte till fil 3? eftersom den kollar == 37 ?

Kolla bara om nästa värde är null eller inte.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av jwradhe:

Men vi säger att det blir 2 fulla filer med 37 i varje, och det blir 14 över, då skrivs dom inte till fil 3? eftersom den kollar == 37 ?

Efter loopen så görs följande som kollar ifall det finns några poster kvar:

if($count > 0) { $_file = "_journaler/".$bilnamn."_korjournal_".$period.$round.".csv"; if(file_exists($_file)){ unlink ($_file); } $handle = fopen($_file, 'x+'); fwrite($handle, $content); fclose($handle); }

Permalänk
Medlem

Jaa såklart nu såg jag! Funkar kanon, tusen tack!

En liten grej jag tittar runt på ang detta oxå är att jag vill skicka med dessa filer i ett mail som generaras efter filerna är klara, men hittar inget direkt

Visa signatur

| AMD Athlon 64 3800+ , MSI K9N PLATINUM nForce570 (AM2) , 250+300GB SATAII , Geforce 6600GT 128MB Silent Pipe (PCI-Express) , 1024GB DDR2 PC-5300 667MHz , Hyndai 17" 12ms |
LG W1-D2RLV , Intel® Core™2 Duo T5600 (1.83GHz) ,1GB DDR II, Radeon® X1600, 120GB SATA |

Permalänk
Medlem
Skrivet av jwradhe:

Jaa såklart nu såg jag! Funkar kanon, tusen tack!

En liten grej jag tittar runt på ang detta oxå är att jag vill skicka med dessa filer i ett mail som generaras efter filerna är klara, men hittar inget direkt

phpmailer ska kunna göra det.
http://phpmailer.worxware.com/index.php?pg=exampleasendmail