webForumDet fria alternativet

Hämta information ifån textfil

PHP

16 svar · 520 visningar · startad av garda

Medlem sedan dec. 200139 inlägg
Frågan#1

Ska hämta information ifrån ett kundkort, kunden skriver sitt kundnr. och sedan ska han få information om ordrar...

Textfilen ser ut som följer, varje kund börjar med:

NY
123(kundnr.)
345(ordernr.) 04-09-06 (datum)
567 (prodnr.) mjölk mellan 30 liter
allt är separerat med tabb, sedan följer alla ordrar till nästa kund
alltså...

NY

Hur gör jag för att lista allt mellan två NY där kundnr. stämmer med det som skickas ifrån ett formulär?
Någon som har ett tips?

Är det file() som gäller eller, filen är på ca. 3000 rader.

Medlem sedan dec. 200139 inlägg
#2

Om jag nu använder koden nedan för att hämta ut tabb-separerad text
och får in det i en tabell, så har jag lite problem med att börja vid ett
bestämt kundnummer och sluta vid nästa NY.. Någon?

<?
$fil = ("/home/sites/site56/transportfil.txt");

if ($contents = file($fil)) {
foreach($contents as $line) {
$fields = explode("\t", $line);
$A = $fields[0];
$B = $fields[1];
$C = $fields[2];
$D = $fields[3];
$E = $fields[4];

echo "\<tr\>\<td\>$A\</td\>\<td\>$B\</td\>\<td\>$C\</td\>\<td\>$D\</td\>\<td\>$E\</td\>\</tr\>";

}

}
?>

Medlem sedan feb. 20001 861 inlägg
#3
$fil = ("/home/sites/site56/transportfil.txt");

if ($contents = file($fil)) {
foreach($contents as $line) {
[B]if(trim($line) != "NY" && trim($line) != "") {[/B]
$fields = explode("\t", $line);
$A = $fields[0];
$B = $fields[1];
$C = $fields[2];
$D = $fields[3];
$E = $fields[4];

echo "<tr><td>$A</td><td>$B</td><td>$C</td><td>$D</td><td>$E</td></tr>";

[B]}[/B]
}
}

Inte snyggt men det funkar. :birp

Medlem sedan dec. 200139 inlägg
#4

Kanon, för att ta bort NY. Men jag vill att den ska börja vid ett speciellt kundnr.
och sendan bara skriva ut tills nästa NY kommer.

Det var nog jag som förklarade lite dåligt....

Medlem sedan feb. 20001 861 inlägg
#5

Lägg en liknande koll före "echo..." nåt i stil med:
if($A == $kundnr) {
echo "<tr>......";
}

Fortfarande inte snyggt... :e

Medlem sedan dec. 200139 inlägg
#6

Tack, men då skriver man ju bara ut kundnummret och det som finns på
den raden, hur får jag den att skriva ut det okända antal rader som finns
tills nästa NY?

(Det behöver inta vara snyggt...:-)

Medlem sedan feb. 20001 861 inlägg
#7

Det ser alltså ut precis som i din första post?
När du skrev tabbseparerat utgick jag från följande:

NY
121212 tabb 777 tabb Krokodil tabb Flingonsnabel

Men det är alltså:
NY
kundnr
ordernr
nått annat nr

kundnr
ordernr
nått annat nr

NY
kundnr
ordernr
nått annat nr

?

Medlem sedan dec. 200139 inlägg
#8

Här kommer ett exempel:

NY
123
2_567<tab>2002-10-04
174-010<tab>Handy wipes<tab>8<tab>LIT

NY
124
2_571<tab>2002-10-04
197-010<tab>Spit fire<tab>1<tab>ST
137-020<tab>Gas<tab>1<tab>ST

NY
125
2_597<tab>2002-10-15
193-010<tab>Lim på rulle<tab>12<tab>ST

Medlem sedan mars 20034 471 inlägg
#9

Du kan dela upp dina poster på följande vis:

$filnamn = "/home/..../kunder.txt"; //Eller vad den nu heter
$filStr = file_get_contents($filnamn); //Ger hela innehållet i en string
$kunder = explode("NY", $filStr);

Då blir $kunder en vektor som innehåller strängar enl (*):

$kunder[1] = "
123
2_567<tab>2002-10-04
174-010<tab>Handy wipes<tab>8<tab>LIT

"
$kunder[2] = "
124
2_571<tab>2002-10-04
197-010<tab>Spit fire<tab>1<tab>ST
137-020<tab>Gas<tab>1<tab>ST

"
$kunder[3] = "
125
2_597<tab>2002-10-15
193-010<tab>Lim på rulle<tab>12<tab>ST

"

Sedan kan du göra all parsning inom de olika indexen i kunder.

(*) Om det finns något tecken (mellanslag, ny rad...) före NY kommer index 0 att innehålla dessa tecken. Om NY är de allra första tecknen så vet jag inte om index 0 blir tomma strängen eller första kunden. Borde gå lätt att testa...

Medlem sedan feb. 20001 861 inlägg
#10

Smart!
Det borde väl gå att köra trim($filStr) ?

Medlem sedan dec. 200139 inlägg
#11

Bra!! Då kommer nästa fråga..:-)

Hur lyckas jag få in de olika värdena i variabler?? om jag kör något liknade detta:
foreach($kunder as $line) {
$fields = explode("\t", $line);
$A = $fields[0];
...

Så funkar det ju inte riktigt, eftersom det både är \n och \t som behövs...?

Medlem sedan aug. 20002 975 inlägg
#12

Annars borde det gå att göra något på det här hållet:

$search = "123"; // Sökt kundnummer

$filename = 'textfil.txt';
$fp = fopen($filename, 'r');
$content = fread($fp, filesize($filename));
fclose($fp);

preg_match("/NY\\s+($search\\s+.*?)(NY|$)/s", $content, $match);

echo $match[1];
Medlem sedan mars 20034 471 inlägg
#13

OlleBoop skrev:

Smart!
Det borde väl gå att köra trim($filStr) ?

Ja. :)

garda skrev:

....Hur lyckas jag få in de olika värdena i variabler?? om jag kör något liknade detta:
foreach($kunder as $line) {
$fields = explode("\t", $line);
$A = $fields[0];
...

Så funkar det ju inte riktigt, eftersom det både är \n och \t som behövs...?

Det här fungerar nog även om det väl troligen inte är det mest effektiva sättet:

foreach($kunder as $line) {
 $line = str_replace("\\n","\\t", trim($line)); //ersätter alla \\n med \\t
 $fields = explode("\\t", $line);
 $A = $fields[0];
...
}

Den andra möjligheten är att använda strtok:

foreach($kunder as $str) {
 $str = trim($str);
 $field = strtok($str, "\\n\\t"); //delar upp $str i de bitar som blir kvar utan \\n och \\t
 while($field) {
    $A = trim($field);  //*
    $field = strtok("\\n\\t");  //Den kommer ihåg $str och var den är i strängen
 }
}

I stället för $A, $B ... kan du kanske stoppa dom i en vektor som du kan iterera dig fram över i whilesatsen....

Medlem sedan dec. 200139 inlägg
#14

Tack alla!! Fan, upptäckte precis att killen jag gör detta åt, hans webhotell har bara php version 4.1 så file_get_contents funkar inte...

Om jag går vidare med Mattes exempel så funkar det ju jätte bra att få ut en viss kunds data! Men då får jag problem att formatera texten snyggt, det bästa vore ju att få ut det radvis och sedan med en variabel för varje tab...

J*vlar va krånglig jag ska vara..:-)

Medlem sedan aug. 20002 975 inlägg
#15

garda skrev:

Tack alla!! Fan, upptäckte precis att killen jag gör detta åt, hans webhotell har bara php version 4.1 så file_get_contents funkar inte...

Om jag går vidare med Mattes exempel så funkar det ju jätte bra att få ut en viss kunds data! Men då får jag problem att formatera texten snyggt, det bästa vore ju att få ut det radvis och sedan med en variabel för varje tab...

Då är det väl bara att gå vidare med det:

$search = "123"; // Sökt kundnummer

$filename = 'textfil.txt';
$fp = fopen($filename, 'r');
$content = fread($fp, filesize($filename));
fclose($fp);

preg_match("/NY\\s+($search\\s+.*?)(NY|$)/s", $content, $match);

$item = preg_split("/\\n/", trim($match[1]));

for ($i=0; $i<count($item); $i++) {
   $item[$i] = explode("\\t", trim($item[$i]));
}

// Endast för att i exemplet visa innehållet i arrayen
echo "<pre>";
print_r($item);
echo "</pre>";
Medlem sedan dec. 200139 inlägg
#16

Kanon!!! En liten list() sen blev det precis som det var tänkt.

Tack för hjälpen!

$search = "123";
$filename = ("fil.txt");
$fp = fopen($filename, 'r');
$content = fread($fp, filesize($filename));
fclose($fp);

preg_match("/NY\s+($search\s+.*?)(NY|$)/s", $content, $match);
$item = preg_split("/\n/", trim($match[1]));
for ($i=0; $i<count($item); $i++) {
list($A, $B, $C, $D, $E) = explode("\t", trim($item[$i]));
echo "<tr><td>$A</td><td>$B</td><td>$C</td><td>$D</td><td>$E</td></tr>";
}

Medlem sedan dec. 200139 inlägg
#17

Tar upp denna tråden då jag ska spinna vidare med ett liknande problem...
Om jag nu tar mitt accepterade svar (ovan) och vill lista alla unika, hur göra? Finns det något sätt att som när man hämtar ifrån en databas använda distinct, eller något liknande?

(Jag har gjort en select i loopen men vill bara lista unika kategorier...)

262 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)