Ik ben op zoek naar een mogelijkheid om bepaalde data uit mijn database op vaste posities in een txt file te maken die dan weer aan een email gehangen word.
Dat aan een email hangen is natturlijk geen probleem echter het correct maken van de txt file wel aangezien alle gegevens met vaste posities een voorloopnullen moeten worden gamaakt.
De reden dat het met een txt file moet is dat de verzonden infomatie (in de txt file) daardoor eenvoudig ingelezen kan worden in een ander programma.
Met [php]sprintf[/php] kan je heel goed nummers in een bepaald verband proppen:
<?php
$recordSoort = 1;
$debiteNummer = 123456789;
$datum = array(2007, 10, 30);
$bedrag = 761;
$btw = 4308;
gebruik sprintf in plaats van printf om het terug te krijgen in plaats van te printen.
edit: even snel een handleiding sprintf:
% geeft aan dat er een 'variabele' volgt, de 0 is het karakter dat als vulling dient, het nummer dat tussen de vulling en de letter staat is de lengte die het geheel moet krijgen, en de letter is het type. 'd' voor integer, 'f' voor float, etc.
Ben nu al een aantal dagen om dit nu ook zo te laten werken dat het in een plat textbestand word opgeslagen, echter ik doe hier duidelijk iets fout, maar kom er niet achter wat ik fout doe.
<?
$recordsoort = "0" ;
$crediteur = "TAX";
$aanleverdatum = date("dmy");
$kop = ('%01d'
. '%03d' // crediteur
. '%06d' // aanleverdatum
. "\r\n", // harde return voor platte txt files
$recordsoort,
$crediteur,
$aanleverdatum);
// % geeft aan dat er een 'variabele' volgt, de 0 is het karakter dat als vulling dient, het nummer dat tussen de vulling en de letter staat is de lengte die het geheel moet krijgen, en de letter is het type. 'd' voor integer, 'f' voor float, etc. //
$bestandsnaam = "test.txt";
$filehandle = fopen($bestandsnaam, "w");
fwrite($filehandle, $kop);
fclose($filehandle);
?>
Hij maakt de textfile nu inderdaad aan zonder error, alleen maakt hij van TAX drie nullen, zoals je ziet ben ik geen expert, vermoedelijk dien ik voor de %03d de d te veranderen in een ander type, echter geen idee welke.
d = integer
f = float
maar wat gebruik ik bij letters ??
Ik heb nog eens goed gekeken naar handleidingen om de mogelijkheden beter te bestuderen echter mis daar 1 ding en kan ook niet zien of dat mogelijk is. namelijk het links uitlijnen.
zeg dat ik bv 16 posities aan een variable wil toekennen waarbij ik de uitkomst wil als volgt wil hebben :
testje dus eerste 16 posities links uitgelijnd, 12345 15 posities rechts uitgelijnd met voorlopers opgevuld met nullen.
Hebben jullie een advies waar ik wat meer specifieke info betreffende deze werkwijze kan vinden (heb reeds behoorlijk gegoogled) dan hou ik mij aanbevolen voor een url.
Edit:
Nog ff een test gedaan, en dit:
<?php
$voorbeeld = "testje" ;
$getal = "12345" ;
$str = sprintf ('%-16s %015d' . "\r\n", $voorbeeld, $getal);
$fp = fopen ('test.txt', 'wb');
fputs ($fp, $str, strlen ($str));
fclose ($fp);
?>
levert een tekstbestand op dat op de goede wijze geformatteerd is. Je moet hem alleen niet in een browser gaan bekijken, want een browser doet niet met meerdere spaties achter elkaar. Zodra het je bestand test.txt opent, zie je dat het goed gaat.
met printf kan je inderdaad alleen maar aan de linkerkant opvullen, en dan kan je alleen opvullen met nullen of met spaties.
Met deze functie kan je aan de rechterkant opvullen, en hij heeft nog wat meer fashionable functies zoals een vulling die langer dan 1 karakter mag zijn:
<?php
function fillUp($content, $length, $filler = '0')
{
$string = substr($content, 0, $length);
if(strlen($content) < $length) {
while(strlen($string) < $length) {
$string .= substr($filler, strlen($string) % strlen($filler), 1);
}
}
return $string;
}
echo fillUp('Hello', 16, '0') . '<br>';
// of bijvoorbeeld
echo fillUp('Hello', 32, 'world') . '<br>';
?>
Als je sprintf en deze functie combineert, kan je bereiken wat je wilt:
<?php
$string = fillUp('testje', 16, '0') . sprintf('%015d', 12345);
// levert op: testje0000000000000000000012345
?>