[PHP] Komma slaat rest veld csv bestand over

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 23-09 20:49
Mijn vraag
Ik lees momenteel data uit een csv bestand in een MySQL database.
De database velden worden gescheiden door een ;
Als ik bij de prijs kom en deze boven de 1000 uitkomt gaat het fout. Deze getallen worden namelijk als 1,249.00 in het csv bestand gezet ( Dit kan ik niet aanpassen ik maak de csv bestanden niet )
In de database komt vervolgens 1 ipv 1249.00.

Met deze code lees ik het csv bestand uit.
code:
1
2
3
4
while (($emapData = fgetcsv($file, 1000, ";", '"')) !== FALSE) {
$sales_price_inc = $emapData[15];
// etc etc
}


Mij vraag is dus hoe zorg ik ervoor dat hij de , gewoon als string leest en niet het veld overslaat.


Relevante software en hardware die ik gebruik
PHP MYSQL

Beste antwoord (via Jasper_S1985 op 25-03-2021 14:46)


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 11:46
Als je input altijd een komma heeft bij duizendtallen, en je weet dat het altijd zo is, kan je dat natuurlijk gewoon weghalen;
PHP:
1
$sales_price_inc = str_replace(',', '', $emapData[15]);

Alle reacties


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:49

Janoz

Moderator Devschuur®

!litemod

De vraag is voornamelijk waar dit gebeurt. Gebeurt het al in de fgetcsv, heb je ergens een cast, hoe ziet de insert query er uit, hoe zit je database er zelf uit. Zonder die informatie is niet te zeggen waar het mis gaat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 11:46
Als je input altijd een komma heeft bij duizendtallen, en je weet dat het altijd zo is, kan je dat natuurlijk gewoon weghalen;
PHP:
1
$sales_price_inc = str_replace(',', '', $emapData[15]);

Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 23-09 20:49
Het ging inderdaad op een andere plek mis dan dat ik dacht. In de insert query stond gewoon netjes 1,049.00 dus bij het schrijven naar de database ging het fout. In dat geval was de str_replace een makkelijke oplossing!
THX

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Jasper_S1985 schreef op donderdag 25 maart 2021 @ 14:46:
Het ging inderdaad op een andere plek mis dan dat ik dacht. In de insert query stond gewoon netjes 1,049.00 dus bij het schrijven naar de database ging het fout.
Euh, sla je bedragen dan als string op? Hoe ziet je insert eruit (dus stukje PHP code)?

https://niels.nu


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Hydra schreef op donderdag 25 maart 2021 @ 16:04:
[...]


Euh, sla je bedragen dan als string op? Hoe ziet je insert eruit (dus stukje PHP code)?
Zoals ik het lees, juist niet:

SQL:
1
INSERT INTO Foo (Bar, Baz) VALUES (1, 1,249.00)


Gezien de mededeling uit de TS:
In de database komt vervolgens 1 ipv 1249.00.
Al zou dat een fout moeten geven over een verschillend aantal kolommen? Of er wordt wel een query gebouwd met aanhalingstekens, waardoor z'n databaseserver de string omzet naar numeriek:
SQL:
1
INSERT INTO Foo (Bar, Baz) VALUES ('1', '1,249.00')

En door locale-instellingen wordt dat geparsed als 1,249 en afgerond naar de integer 1? Wat Janoz dus ook zegt:
Janoz schreef op donderdag 25 maart 2021 @ 14:33:
De vraag is voornamelijk waar dit gebeurt. Gebeurt het al in de fgetcsv, heb je ergens een cast, hoe ziet de insert query er uit, hoe zit je database er zelf uit. Zonder die informatie is niet te zeggen waar het mis gaat.
Anyhow, des te meer reden om prepared statements of een ORM te gebruiken, en niet zelf SQL-strings bij elkaar te harken met string formatting.

[ Voor 50% gewijzigd door CodeCaster op 25-03-2021 16:10 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
CodeCaster schreef op donderdag 25 maart 2021 @ 16:05:
[...]

Zoals ik het lees, juist niet:

SQL:
1
INSERT INTO Foo (Bar, Baz) VALUES (1, 1,249.00)
Daarom dus, want bovenstaande zou gewoon heel hard een SQL error geven (ik ga er even vanuit dat dit niet zo'n MySQL 'quirk' is). Dus daarom vraag ik aan de OP wat 'ie nu precies doet.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 23-09 20:49
Naja het ging dus niet fout in andere kolommen omdat het de laatste kolom was :)
Pagina: 1