txt file met vaste posities maken
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.
posities in txtfile:
Recordsoort: pos 1 lengte 1
Debiteurnr: pos 2 lengte 16
Datum: pos 18 lengte 6
bedrag: pos 39 lengte 15
btw bedrag: pos 54 lengte 15
Als voorbeeld selecteer ik een bedrag, datum en debiteur uit mijn database.
761 => Bedrag
123456789 => debiteur nummer
30-10-2007 => datum
in mijn txt file moet nu de regel er zo uit komen te zien :
10000001234567890301007 000000000076100000000000004308
4308 op het eind is het btw bedrag.
hopelijk iemand een idee ?
Ton
in de txtfile moet dan komen :
2
sprintf kan je heel goed nummers in een bepaald verband proppen:
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.
Met Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$recordSoort = 1;
$debiteNummer = 123456789;
$datum = array(2007, 10, 30);
$bedrag = 761;
$btw = 4308;
printf('%01d' //recordSoort
. '%016d' // debiteNummer
. '%02d%02d%02d' // datum (dag, maand, jaar)
. "\n" // enter
. '%015d' // bedrag
. '%015d', // btw
$recordSoort,
$debiteNummer,
$datum[2], $datum[1], substr($datum[0], 2),
$bedrag,
$btw);
?>
$recordSoort = 1;
$debiteNummer = 123456789;
$datum = array(2007, 10, 30);
$bedrag = 761;
$btw = 4308;
printf('%01d' //recordSoort
. '%016d' // debiteNummer
. '%02d%02d%02d' // datum (dag, maand, jaar)
. "\n" // enter
. '%015d' // bedrag
. '%015d', // btw
$recordSoort,
$debiteNummer,
$datum[2], $datum[1], substr($datum[0], 2),
$bedrag,
$btw);
?>
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.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Ton
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
$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);
?>
$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);
?>
Edit:
Overigens:
Dit:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$kop = ('%01d'
. '%03d' // crediteur
. '%06d' // aanleverdatum
. "\r\n", // harde return voor platte txt files
$recordsoort,
$crediteur,
$aanleverdatum);
?>
$kop = ('%01d'
. '%03d' // crediteur
. '%06d' // aanleverdatum
. "\r\n", // harde return voor platte txt files
$recordsoort,
$crediteur,
$aanleverdatum);
?>
moet zijn:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$kop = sprintf ('%01d'
. '%03d' // crediteur
. '%06d' // aanleverdatum
. "\r\n", // harde return voor platte txt files
$recordsoort,
$crediteur,
$aanleverdatum);
?>
$kop = sprintf ('%01d'
. '%03d' // crediteur
. '%06d' // aanleverdatum
. "\r\n", // harde return voor platte txt files
$recordsoort,
$crediteur,
$aanleverdatum);
?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
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 ??
Ton
s van string :)
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 :
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
$voorbeeld = "testje" ;
$getal = "12345" ;
sprintf ('%16s'
. '%015s'
. "\r\n", // harde return voor platte txt files
$voorbeeld,
$getal);
?>
$voorbeeld = "testje" ;
$getal = "12345" ;
sprintf ('%16s'
. '%015s'
. "\r\n", // harde return voor platte txt files
$voorbeeld,
$getal);
?>
in bovestaand voorbeeld is dan de bedoeling :
testje 000000000012345
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.
vriendelijke groet,
Ton
output: 0000000000012345
Edit:
Nog ff een test gedaan, en dit:
Code (php)
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.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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>';
?>
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:
Code (php)
1
2
3
4
2
3
4
<?php
$string = fillUp('testje', 16, '0') . sprintf('%015d', 12345);
// levert op: testje0000000000000000000012345
?>
$string = fillUp('testje', 16, '0') . sprintf('%015d', 12345);
// levert op: testje0000000000000000000012345
?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
testje 000000000012345
Edit:
de ubb parser van phphulp haalt de spaties er dus weer uit, maar je begrijpt mijn bedoeling hopelijk ;-)
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Prettig te zien dat mijn vraag in dit geval ook weer wat voor anderen opgeleverd heeft !