---
title: "Gå igenom textfil rad för rad.."
type: "forum-thread"
url: "https://www.webforum.nu/amne/perl-ruby/53306-gå-igenom-textfil-rad-för-rad"
topic: "Perl & Ruby"
topic_url: "https://www.webforum.nu/amne/perl-ruby"
author: "Cactuz"
published: "2002-09-15T19:12:47.000Z"
updated: "2003-07-07T22:21:04.000Z"
replies: 11
views: 491
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/perl-ruby/53306-gå-igenom-textfil-rad-för-rad"
---

# Gå igenom textfil rad för rad..

## #1 — Cactuz, 2002-09-15T19:12Z

nu använder jag den här koden

```
open(FILE, "<$lfile");
@rad = <FILE>;
close(FILE);
foreach (@rad) {

($var1,$var2,$var3,$var4) = split(/ :/, $_);
		
if($var4 eq 'TEST'){
} else {
	print("$_ - $var1,$var2,$var3,var4\n");
}
}
```

Men nu skriver den ut alla rader sen kör den  - $var1,$var2,$var3,var4 på en rad.

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

## #2 — Jojoxx, 2002-09-15T19:32Z

Om vi tänker oss att data-filen ser ut så här;

```
1 :2 :3 :4
A :B :C : DATA
5 :6 :7 :8
```

(Det skall inte vara ett mellanslag mellan : och "DATA", men förumet gör om denna kombination till :DATA)

Så innehåller ju inte $var4 på andra raden bara "DATA" utan "DATA\[radbrytning\]". Denna kan du plocka bort genom att använda kommandot "chomp" (som tar bort sista logiska tecknet i en sträng ifall det är en radbrytning).

```
foreach (@rad) {
chomp;

# ...osv
```

(Sedan fattas det ett $ före "var4" på print-raden :) )

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

## #3 — Cactuz, 2002-09-15T19:49Z

Men jag gjorde om variablerna lite bara.. jag ville inte ge ut dom :)

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

## #4 — Cactuz, 2002-09-15T19:56Z

Och den skriver fortfarande ut (om jag ska följa ditt exempel)

1 :2 :3 :4
A :B :C : DATA
5 :6 :7 :8
$var1 - $var1,$var2,$var3,var4\\n

eller nåt liknande... Jag vill att den ska skriva ut

1 :2 :3 :4
$var1,$var2,$var3,var4\\n
A :B :C : DATA
$var1,$var2,$var3,var4\\n
5 :6 :7 :8
$var1,$var2,$var3,var4\\n

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

## #5 — Jojoxx, 2002-09-15T20:18Z

Ursäkta, jag missade att du jämförde med 'TEST' i koden och inte 'DATA'. Vet inte var jag fick DATA från :), men jaja. 

Det du gör i koden är ju att kolla om $var4 är lika med "TEST". I så fall görs ingenting (eftersom det enda du gör ligger i else-satsen). Alltså, i alla fall där $var4 INTE är lika med "TEST" skriver du ut *den inlästa raden* förljt av " - " och de 4 variablerna du nyss skapat med split, separerade av komma (om vi bortser från att du missat $ för var4). Sist kommer en radbrytning. Alltså kommer allt att skrivas på en rad (för varje inläst text-rad som stämmer if-satsen). Vill du ha varje rad från text-filen bli 2 rader i output'en får du slänga in en radbrytning till. Så långt fungerar scriptet. Sedan får du tänka på att om du skickar detta till en webbläsare som kommer allt att visas på en och samma rad i alla fall eftersom webbläsaren läser html, där radbrytning är "\<br\>", men det ser du ju genom att "visa källa".

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

## #6 — Cactuz, 2002-09-15T20:30Z

Men jag skickar det över IRC :)

Men jag tar det från början...

Jag behöver ett script som går igenom rad för rad i ett textdokument och om t.ex rade är hej så ska den gör nåt annars ska den t.ex bara skriva ut raden som den är.

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

## #7 — Jojoxx, 2002-09-16T05:43Z

Visst, du är helt på rätt väg. $\_ är ju som bekant en underförstådd variabel i perl, men för att vi inte skall tappa bort den någonstanns i hanteringen (om du lägger till fler saker i loopen som påverkar $\_) så byter vi ut den mot en vanlig variabel.

```
foreach $this (@rad){
chomp $this;
if($this eq "hej"){
#Gör något.
} else {
print $this;
}
}
```

Men tänk på att perl hanterar radbrytningar som logiska tecken. D.v.s., kör du scriptet på ett windows-baserat system kommer \[cr\]\[lf\] (alltså 2 tecken) att ses som ett logiskt tecken, nämligen "radbrytning". Chomp ex. kommer alltså egentligen att plocka bort 2 tecken. Detta för att det skall bli enklare att programmera och det är enklare att flytta scriptet mellan olika system. Problem kan dock uppstå  om du kör scriptet på en Unix-burk och text-filen kommer från en windows-maskin. Enklast i så fall är att se till att filen sparas i \*nix-format (med bara \[lf\] som radbrytning).

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

## #8 — Cactuz, 2003-07-07T17:52Z

När jag kör den här koden:

```
open(FILE, "text.txt");
@rad = <FILE>;
close(FILE);
foreach (@rad)
{
 chomp $_;
 if($_ eq "$test")
 {
  print "hurra.. det stämde\n";
 } else {
  print "skit också\n";
 }
}
```

så blir $\_ inehållet i hela filen och inte bara den aktuella raden. "foreach" körs också naturligtvis också bara en gång då.

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

## #9 — Jojoxx, 2003-07-07T20:02Z

Ett tänkbart fel är att text.txt är genererad/redigerad på ett windows-system (och har radbrytningssekvensen \[cr\]\[lf\]) och scriptet körs på någon unix-dialekt som används \[lf\]. Perl använder nämligen logiska radbrytningar, d.v.s. körs scriptet under windows syftar "\\n" på "\[cr\]\[lf\] medans om scriptet körs under unix blir det "\[lf\]" (och under mac "\[cr\]"). Kan det stämma? I lite mer fullfjädrade edtiorer kan du välja vilket format du vill spara, så även under windows kan du skapa en unix-lik text-fil.

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

## #10 — Cactuz, 2003-07-07T21:16Z

Filen är sparad under windows (anteckningar) och används under windows med ett script som körs av activeperl

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

## #11 — Jojoxx, 2003-07-07T22:17Z

... enda sättet jag kan få fram fenomenet i ActivePerl (kör build 633) är att tvinga min editor att spara text-filen i mac(!) format, alltså endast \[cr\] som radbrytning. Både \[lf\] och \[cr\]\[lf\] funkar fina fisken.

Har du möjlighet att spara om text-filen i olika format (unix/windows), bara för att testa?

Vad har du för version och build av ActivePerl?

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

## #12 — Hansen, 2003-07-07T22:21Z

Kastar mig in, dock inte riktigt säker på vad du söker.

```
#!/usr/bin/perl

use strict;
use warnings;

while ( <DATA> ) {
    chomp;

    if ( /hansen/i ) {
        print ".. processa data ..\n";
        next;
    }

    print $_, "\n";
}

__DATA__
Cactuz:123456
Hansen:123456
Jojoxx:123456
```

Output:

```
Cactuz:123456
.. processa data ..
Jojoxx:123456
```

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

---

Tråden på webben: https://www.webforum.nu/amne/perl-ruby/53306-gå-igenom-textfil-rad-för-rad
