[PHP] problemen met uitlezen csv file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • w00d
  • Registratie: Juni 2004
  • Laatst online: 12:59
Ik heb een csv file die gegenereerd is met wmic. Deze zet in ik in een array in php zodat ik er volgens mee verder kan werken ( dacht ik ).

In een array zetten gaat goed, maar het probleem is dat de data type niet herkend worden. Een integer is geen integer meer en een string kan ik niet vergelijken met een andere string..

Nu heb ik al gelezen dat het niet mogelijk is om een integer die in een array staat als zodanig te herkennen als die uit een csv file komt, maar een simpele string vergelijking is dus ook al niet mogelijk.

Kan je nou gewoon echt niks met een ingelezen csv of vergeet ik nou iets :?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$handle = fopen("hd.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $name = $data[0];
        $free = $data[1];
        $drive = $data[2];
        $size = $data[3];
        
        print_r($data); //output: Array ( [0] => server4 [1] => 29099573248 [2] => C: [3] => 36405072384 )
        
        echo $name;  //output: server4
        if($name == "server4"){
            echo $name; 
        }else{
            echo "helaas"; //output: helaas
        }
}               
fclose($handle);

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:29
php werkt niet met 'integers' of strings deze zet het gewoon om dus als je
$var == $var2 als 1ste var een getal is dan maakt hij van de 2de var ook een getal en vergelijkt hij dit
idem voor strings..

probeer zelf maar is als je vb
PHP:
1
2
3
4
5
6
7
$var=100;
$var2="100";
if($var==$var2){
echo "gelijk";
}else{
echo "niet gelijk";
}


of
PHP:
1
2
3
4
5
6
7
8
9
<?php
$var=hasselt;

if($var=="hasselt"){
echo "gelijk";
}else{
echo "niet gelijk";
}
?>


misschien dat er nog spaties ofzo errond zitten?

[ Voor 23% gewijzigd door Icekiller2k6 op 15-09-2008 18:47 . Reden: tags vergeten ]

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • w00d
  • Registratie: Juni 2004
  • Laatst online: 12:59
nee idd php werkt niet echt met string in integer, maar hij herkend ze nu ook niet als zodanig. Ik kan u niet bijv $size - $free doen. Waarde is dan gewoon 0.

Maar als ik dit doe:
PHP:
1
2
3
4
5
6
7
$a = 5
$b = 4
echo $a - $b;  // 1

$free = 29099573248; 
$size = 36405072384; 
echo $size - $free; // 7305499136

Maar als ik dus waardes uit de array gebruik ( die exact hetzelfde zijn ) dan werkt et niet

Er zit zover ik kan zien geen spaties of dergelijke. Zie print_r output

[ Voor 8% gewijzigd door w00d op 15-09-2008 18:57 ]


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
w00d schreef op maandag 15 september 2008 @ 18:57:
Er zit zover ik kan zien geen spaties of dergelijke. Zie print_r output
Doe anders voor de zekerheid trim($name).

Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Om zeker te weten dat er geen spaties en dergelijk voorstaan kan je gebruik maken van var_dump(), of door de hele string per character te doorlopen en kijken met ord() welke ASCII code er voorkomen. Er kan namelijk ook een ander non printable character in die string staan.

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Het kan zijn dat er nog onzichtbaar een \r of \n staat. Met trim haal je deze zowiezo weg.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
of doe gewoon een : echo 'a' . $string . 'a';
en kijk of de a'tjes wel 100% aansluiten op de string. Basic Debugging volgens mij wat op 100én manieren te doen is.

Acties:
  • 0 Henk 'm!

  • w00d
  • Registratie: Juni 2004
  • Laatst online: 12:59
met ord() de string doorlopen bleek er inderdaad nog verborgen karakters te zijn.
255-254-115-0-101-0-114-0-118-0-101-0-114-0-52 ( server4 )


Met trim haal ik die 2 er niet vanaf, maar dat gaat wel anders lukken. Maar ik vind het wel raar dat er ( in mijn ogen ) platte csv file nog zoveel verborgen karakters zitten..

Maar ja thnxs voor de tip over ord() die wist ik namelijk nog niet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
w00d schreef op dinsdag 16 september 2008 @ 10:52:
met ord() de string doorlopen bleek er inderdaad nog verborgen karakters te zijn.
255-254-115-0-101-0-114-0-118-0-101-0-114-0-52 ( server4 )
What the...
Weet je zeker dat je de juiste file leest? Of op de juiste plek zit te kijken in die file? Dat 255 en 254 verborgen tekens zijn (de zgn. BOM in een unicode file) evenals de 0-bytes is niet zo gek, maar "server4" zijn toch écht geen 'verborgen' tekens :?

Edit: oh, my bad. Ik zie dat "server4" wel in de string hoorde te staan :P In dat geval heb ik niets gezegd en je alleen gewezen op het feit dat je werkt met een unicode bestand ;)

[ Voor 20% gewijzigd door RobIII op 16-09-2008 11:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Het is dus een UTF-16 encoded file, die begint met een BOM en vervolgens per character 2 bytes gebruikt. Er zijn dus geen "verborgen" karakters, je leest de file alleen niet op de juiste manier in.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • w00d
  • Registratie: Juni 2004
  • Laatst online: 12:59
die ascii codes zouden dus gezamelijk server4 moeten vormen. dacht zet et er even bij. Loop nu even te testen met een txt bestand, kan daar ook naartoe exporteren, maar ook daar komt dezelfde bagger code in terug. 8)7 ( maar dat komt dus door die BOM begrijp ik.. )

Toch maar is kijken of ik niet die template van wmic kan aanpassen
Het is dus een UTF-16 encoded file, die begint met een BOM en vervolgens per character 2 bytes gebruikt. Er zijn dus geen "verborgen" karakters, je leest de file alleen niet op de juiste manier in.
Ehh klinkt misschien stom, maar hoe zou ik hem dan moeten inlezen? fgetcsv() lijkt mij toch wel een beetje de manier om een csv in te lezen

[ Voor 34% gewijzigd door w00d op 16-09-2008 11:13 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
w00d schreef op dinsdag 16 september 2008 @ 11:12:
Ehh klinkt misschien stom, maar hoe zou ik hem dan moeten inlezen? fgetcsv() lijkt mij toch wel een beetje de manier om een csv in te lezen
Komaan; dat is gewoon te vinden in de manual (comments):
PHP:
1
setlocale(LC_ALL, 'en_US.UTF-8');


Kwestie van juiste encoding invullen dus.

[ Voor 5% gewijzigd door RobIII op 16-09-2008 11:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • w00d
  • Registratie: Juni 2004
  • Laatst online: 12:59
:X O+ hmm ok over die notatie heb ik dus gewoon domweg heen gelezen. Verklaard het inderdaad wel.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Hier: 115-0-101-0-114-0-118-0-101-0-114-0-52-0 staat inderdaad server4 in UTF16LE.

Met setLocale() zet je de encoding van "alles" op die waarde. Je kunt blijkbaar iets met http://nl.php.net/stream_encoding, maar die functie is niet gedocumenteerd. Mogelijk werkt het toch.

[ Voor 44% gewijzigd door Herko_ter_Horst op 16-09-2008 11:44 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Herko_ter_Horst schreef op dinsdag 16 september 2008 @ 11:38:
Blijkbaar snapt fgetcsv() alleen single-byte encodings (bijv. UTF-8)
UTF-8 is niet single-byte maar een "variable-length character encoding".
Herko_ter_Horst schreef op dinsdag 16 september 2008 @ 11:38:
of misschien zelfs alleen maar ASCII (hoop van niet).
RobIII in "[PHP] problemen met uitlezen csv file" :?

[ Voor 4% gewijzigd door RobIII op 16-09-2008 11:42 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Ok, ok :)
Sorry, ik werd gestoord tijdens het typen en had jouw bericht niet meer meegekregen, was al bezig mijn reactie aan te passen.

[ Voor 5% gewijzigd door Herko_ter_Horst op 16-09-2008 11:52 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • w00d
  • Registratie: Juni 2004
  • Laatst online: 12:59
Ik heb het maar even anders opgelost. Het instellen van de juiste unicode had ook geen succes. Heb daarna nog even lopen testen met UTF-32 en 8 instellen in de xsl template, maar ook zonder succes.

Heb nu met behulp van pstools dezeflde info kunnen opvragen, dit genereerd een schone text bestand die ik keurig uit elkaar kan trekken en verwerken.

Bedank voor de tips, wel weer wat geleerd

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
UTF8 + utf8_decode zou moeten werken toch in PHP?
Pagina: 1