txt file met vaste posities maken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ton

Ton

21/10/2007 08:52:00
Quote Anchor link
Goedemorgen,

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
 
PHP hulp

PHP hulp

28/03/2024 13:48:40
 
Jelmer -

Jelmer -

21/10/2007 10:15:00
Quote Anchor link
Met sprintf kan je heel goed nummers in een bepaald verband proppen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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

Ton

21/10/2007 22:28:00
Quote Anchor link
Hartelijk dank, Uiteindelijk dus veel makkelijker dan ik gedacht had !

Ton
 
Ton

Ton

28/10/2007 10:20:00
Quote Anchor link
Hoi,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
 
Jan Koehoorn

Jan Koehoorn

28/10/2007 10:25:00
Quote Anchor link
Heeft de map waarin je wilt schrijven de goede rechten? Dat kun je checken met je FTP programma.
Edit:
Overigens:


Dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>

moet zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);    
?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Ton

Ton

28/10/2007 11:03:00
Quote Anchor link
Dank je,

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

Jelmer -

28/10/2007 11:12:00
Quote Anchor link
s van string :)
 
Ton

Ton

28/10/2007 22:40:00
Quote Anchor link
heh bedankt Jelmer,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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
 
Jan Koehoorn

Jan Koehoorn

28/10/2007 22:47:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    $getal
= 12345;
    echo sprintf ('%016d', $getal);
?>

output: 0000000000012345

Edit:
Nog ff een test gedaan, en dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?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.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Jelmer -

Jelmer -

28/10/2007 23:00:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
?>


Als je sprintf en deze functie combineert, kan je bereiken wat je wilt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$string
= fillUp('testje', 16, '0') . sprintf('%015d', 12345);
// levert op: testje0000000000000000000012345
?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Jan Koehoorn

Jan Koehoorn

28/10/2007 23:03:00
Quote Anchor link
@ Jelmer: met dat - teken kun je dus ook rechts opvullen. In mijn bestand test.txt staat:
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
 
Jelmer -

Jelmer -

28/10/2007 23:05:00
Quote Anchor link
Weer wat geleerd :)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
testje          000000000012345
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Jan Koehoorn

Jan Koehoorn

28/10/2007 23:09:00
Quote Anchor link
Ik ook ;-)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
testje           000000000012345
 
Ton

Ton

29/10/2007 17:06:00
Quote Anchor link
Prettig te zien dat mijn vraag in dit geval ook weer wat voor anderen opgeleverd heeft !
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.