---
title: "Hämta information ifån textfil"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/110983-hämta-information-ifån-textfil"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "garda"
published: "2004-09-06T21:48:37.000Z"
updated: "2005-03-29T20:14:58.000Z"
replies: 16
views: 526
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/110983-hämta-information-ifån-textfil"
---

# Hämta information ifån textfil

## #1 — garda, 2004-09-06T21:48Z

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.

Permalänk: https://www.webforum.nu/p/110983

## #2 — garda, 2004-09-08T08:13Z

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\>";

	}
}
?\>

Permalänk: https://www.webforum.nu/p/1433104

## #3 — OlleBoop, 2004-09-08T08:41Z

```
$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

Permalänk: https://www.webforum.nu/p/1433122

## #4 — garda, 2004-09-08T08:59Z

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....

Permalänk: https://www.webforum.nu/p/1433135

## #5 — OlleBoop, 2004-09-08T09:18Z

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

Fortfarande inte snyggt... :e

Permalänk: https://www.webforum.nu/p/1433146

## #6 — garda, 2004-09-08T09:55Z

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...:-)

Permalänk: https://www.webforum.nu/p/1433162

## #7 — OlleBoop, 2004-09-08T10:27Z

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

?

Permalänk: https://www.webforum.nu/p/1433178

## #8 — garda, 2004-09-08T10:41Z

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

Permalänk: https://www.webforum.nu/p/1433185

## #9 — aasah, 2004-09-09T16:42Z

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

```php
$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...

Permalänk: https://www.webforum.nu/p/1434051

## #10 — OlleBoop, 2004-09-09T17:03Z

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

Permalänk: https://www.webforum.nu/p/1434064

## #11 — garda, 2004-09-09T17:46Z

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...?

Permalänk: https://www.webforum.nu/p/1434087

## #12 — Matte, 2004-09-09T18:03Z

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

```php
$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];
```

Permalänk: https://www.webforum.nu/p/1434094

## #13 — aasah, 2004-09-09T19:01Z

> **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:

```php
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:

```php
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....

Permalänk: https://www.webforum.nu/p/1434111

## #14 — garda, 2004-09-09T20:02Z

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..:-)

Permalänk: https://www.webforum.nu/p/1434140

## #15 — Matte, 2004-09-09T20:22Z

> **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:

```php
$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>";
```

Permalänk: https://www.webforum.nu/p/1434152

## #16 — garda, 2004-09-09T22:19Z

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\>";
}

Permalänk: https://www.webforum.nu/p/1434259

## #17 — garda, 2005-03-29T20:14Z

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...)

Permalänk: https://www.webforum.nu/p/1581729

---

Tråden på webben: https://www.webforum.nu/amne/php/110983-hämta-information-ifån-textfil
