[PHP] regels uitvullen met spaties tot een bepaalde lengte

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 15:33

sjunnie

U mag ook Sjun zeggen

Topicstarter
We hebben hier een applicatie welke een tekstbestand kan genereren met allerlei geboekte items.
Voor iedere regel staat 1 item, en deze bevat weer meerdere waarden op vastgestelde startpunten.
(bvb: karakter 1 t/m 8 zijn partnummer, karakter 9 t/m 35 woonplaats, etc...)
De laatste karakters uit de regel staan voor artikelomschrijving, maar deze is van een variabele lengte.

Hierin schuilt juist het probleem; Dit laatste bestand moeten we importeren in TNT's Parcelware, maar parcelware accepteert alleen deze bestanden indien deze een vaste regellengte hebben.

Bij geen van beide softwarepakketten hebben we de mogelijkheid om dit aan te passen.

Wat ik dus zou willen is een php-script maken om de ontbrekende karakters aan te vullen met spaties. Ik heb ontdekt dat ik met fgets en fputs wel kan lezen en schrijven naar bestanden, maar ik kom maar niet uit het probleem om regel voor regel met spaties aan te vullen tot n lengte.

Misschien kan het ook op een andere (eenvoudigere) manier, maar mij lijkt een scripttaal als PHP hiervoor het meest geschikt, zodat het voor de persoon welke de bestanden moet verwerken ook eenvoudig te gebruiken blijft.

Kortom: Wie kan me vertellen hoe ik de regels in dergelijke bestanden kan opvullen tot een bepaalde lengte?

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 00:21

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

Verwijderd

strlen() gebruiken. Dit is niet erg moelijk.

Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 15:33

sjunnie

U mag ook Sjun zeggen

Topicstarter
Dit lijkt me wel bruikbaar, alleen moet ik even kijken hoe ik hiermee alle regels in een bestand doorloop.
Verwijderd schreef op woensdag 21 mei 2008 @ 16:19:
strlen() gebruiken. Dit is niet erg moelijk.
Die had ik inderdaad ook gevonden, maar dan weet ik alleen de lengte, maar heb ik de spaties er nog niet achter, en om dit per regel in een while loop te gooien en zo telkens een spatie toe te voegen als strlen($input) != 250 lijkt me alles behalve efficient. 8)7

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 00:21
Ik dacht toch echt te lezen dat het inlezen en wegschrijven je al gelukt was, maar dat je alleen nog met het aanvullen van de regels tot aan de gewenste lengte zat... :P

Maargoed, zoiets is wel erg simpel in PHP eigenlijk. Zal zoiets worden (uit mn hoofd, ongetest, enkel voor het globale idee ;))?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$input = fopen('inputfile.txt', 'r');
$output = fopen('outputfile.txt', 'w');
if ($input && $output) {
    while (!feof($input)) {
        $inputline = fgets($input, 4096);
        $outputline = str_pad(trim($inputline), 250);
        fwrite($output, $outputline."\n");
    }
    fclose($input);
    fclose($output);
}
?>

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • JasperE
  • Registratie: December 2003
  • Laatst online: 11-09 18:26
Wil je alleen spaties op het eind van de regels toevoegen of moet iedere kolom met data als het ware een vaste lengte krijgen?
Misschien handig als je een regel uit het bronbestand paste met daarbij een versie van die regel hoe het eruit moet komen te zien?

[ Voor 34% gewijzigd door JasperE op 21-05-2008 16:42 ]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
als je de link uit de eerste reply volgt zie je aan de linkerkant talloze functies staan waarmee je direct of via een of andere omweg kan bereiken wat je wilt.... (en daarvan lijkt str_pad me de beste ja)

Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 15:33

sjunnie

U mag ook Sjun zeggen

Topicstarter
Xander schreef op woensdag 21 mei 2008 @ 16:38:
Ik dacht toch echt te lezen dat het inlezen en wegschrijven je al gelukt was, maar dat je alleen nog met het aanvullen van de regels tot aan de gewenste lengte zat... :P
Ja, het bestand inlezen in z'n geheel wel, maar ik had nog niet verder gekeken dan m'n neus lang is wat betreft afhandeling per regel.

Ik heb je script nog niet getest, maar ik denk dat je me meer dan voldoende op het juiste spoor hebt gezet om hiermee uit de voeten te kunnen, dank! _/-\o_
JasperE schreef op woensdag 21 mei 2008 @ 16:41:
Wil je alleen spaties op het eind van de regels toevoegen of moet iedere kolom met data als het ware een vaste lengte krijgen?
Misschien handig als je een regel uit het bronbestand paste met daarbij een versie van die regel hoe het eruit moet komen te zien?
Alleen achteraan de regel moeten spaties zodat de regel bvb 250 karakters telt.
als je een voorbeeldbestand zoekt;
code:
1
2
Dit is een voorbeeldregel uit het invoer bestand
Dit is een tweede voorbeeldregel

Geen echt voorbeeld natuurlijk, maar je kunt met je blote oog al zien dat regel 2 minder karakters telt dan regel 1, en dat mag niet. regel 2 moet dus aangevuld worden met spaties.
Sorry dat ik geen real data post, maar dat lijkt me verder ook niet echt relevant voor dit vraagstuk. ;)

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 01:02
Aangezien niemand anders het doet, wil ik nog even file() op tafel gooien. Lijkt me de makkelijkste oplossing. Array die je terugkrijgt met for(each) doorlopen, daarbij str_pad() gebruiken. Aangepaste array kun je direct met file_put_contents() weer naar een bestand schrijven (tenzij je met PHP < 5 zit).

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 00:21
Raynman schreef op woensdag 21 mei 2008 @ 17:53:
Aangezien niemand anders het doet, wil ik nog even file() op tafel gooien. Lijkt me de makkelijkste oplossing. Array die je terugkrijgt met for(each) doorlopen, daarbij str_pad() gebruiken. Aangepaste array kun je direct met file_put_contents() weer naar een bestand schrijven (tenzij je met PHP < 5 zit).
Maar dan zit je wel met het hele bestand in een array. Ik kan voorstellen dat dat erg traag wordt met grotere bestanden. Volgens mij heb je dat probleem niet bij de (overigens door de TS zelf aangedragen) fgets()-functie?

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

Verwijderd

Je kan het bestand met file() totaal laten inlezen, wat geen performance-verlies oplevert door gebruik van reset() en next() om de Array te doorlopen.

Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

PHP.net: Example #6 printf(): string specifiers
PHP:
1
2
3
4
5
6
printf("[%s]\n",      $s); // standard string output
printf("[%10s]\n",    $s); // right-justification with spaces
printf("[%-10s]\n",   $s); // left-justification with spaces
printf("[%010s]\n",   $s); // zero-padding works on strings too
printf("[%'#10s]\n",  $s); // use the custom padding character '#'
printf("[%10.10s]\n", $t); // left-justification but with a cutoff of 10 characters

str_pad is een goede oplossing als je alles al hebt, maar waarom die tussenslag? Zet de data meteen goed weg, in het loopje waar je alles wegschrijft:
PHP:
1
2
3
4
5
6
7
loop
  // verzamel data
  ...
  // schrijf naar file
  fprintf(fileptr, "%-8s%-26s...", $PartNumber, $Woonplaats, ...)
  ...
end loop

... gecensureerd ...

Pagina: 1