Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP ja CSV tiedoston lukeminen

Sivun loppuun

hessu007 [19.06.2022 10:51:43]

#

Olen sen verran alussa tässä asiaa ja kysyn vinkkiä tai opastusta.

Yritän suodattaa CSV tiedostosta päivämäärä välillä tietoa. Eli esim. 2022-04-01 ja 2022-04-05. Yksittäisen päivämäärän kanssa onnistuu kyllä.

Minun koodi on:

use League\Csv\Reader;
use League\Csv\Statement;

require 'League/autoload.php';

$path = 'spot2.csv';
$csv = Reader::createFromPath($path, 'r');
$tmp = new SplTempFileObject();
foreach ($csv as $record) {
    $tmp->fputcsv($record);

}

$reader = Reader::createFromFileObject($tmp)->setHeaderOffset(0);
$stmt = Statement::create()
->where(function($row) { return strpos($row['Date'], '2022-04-03') !== false; });
$result = $stmt->process($reader);

$_SESSION["data"] = $result;

Jos joku voi antaa selkeä vinkin tai ohjeistuksen , kiitollinen siitä

vesikuusi [19.06.2022 15:50:21]

#

Avain asiaan löytyy seuraavasta lausekkeestasi.

return strpos($row['Date'], '2022-04-03') !== false

Tuohon perään tulee lisätä ehtoja, joiden mukaan haluat suodattaa. Käytä &&-operaattoria, esimerkiksi näin.

strpos($row['Date'], '2022-04-03') !== false && strpos($row['Date'], '2022-04-04') !== false

Vinkkinä, että tuolla tavalla muotoiltuihin päivämääriin voi PHP:ssä myös käyttää pienempi-kuin- ja suurempi-kuin-operaattoreita. Ne toimivat juuri kuten niiden odottaisikin toimivan. Tämä olisi suotavampaa kuin ehtojen yhdistäminen pitkäksi lausekkeeksi monella &&-operaattorilla.

Vertailuoperaattoreista voit lukea esimerkiksi täällä. Suurinpiirtein samalla tavalla toimivat C- ja PHP-kielissä.

hessu007 [19.06.2022 17:31:44]

#

Kiitos paljon vinkistä. Tuo itsekin kokeilin, mutta ei toimi.

$stmt = Statement::create()
  ->where(function($row) { return strpos($row['Date'], '2022-04-01') !== false  && strpos($row['Date'], '2022-04-02') !== false; });

$result = $stmt->process($reader);

echo json_encode($result);

palautta tyhjän taulukon []

hessu007 [19.06.2022 19:07:00]

#

Helpointa olisi varmaankin jos vertailuoperaattorit toimisivat esim.: 2022-04-01 <= 2022-04-05 tai vastaavaa.

Toinen vaihtoehto on jos tuo strpos needles saisi lukemaan Array.

vesikuusi [19.06.2022 19:29:43]

#

&&-operaattori on muuten tuohon tapaukseen väärä. Olisi pitänyt kirjoittaa ||-operaattori. Eli ei JA, vaan TAI.

hessu007 kirjoitti:

Helpointa olisi varmaankin jos vertailuoperaattorit toimisivat esim.: 2022-04-01 <= 2022-04-05 tai vastaavaa.

Kyllä, tämä toimii.

hessu007 [19.06.2022 22:08:15]

#

Jep ||-operaattori, mutta ei <=

'2022-04-02') !== false <= strpos($row['Date'], '2022-04-04') !== false; });

antaa virheen editorissa false; }); false; jälkeen virhe: Expected: semicolon

eli luulen, että ei hyväksy <=

Eli miten toimisi niin, että valitsee päivät 2 päivämäärän välillä?

vesikuusi [19.06.2022 23:24:12]

#

Siinä on syntaksivirhe. Jos korjaat sen, niin tuo menee kyllä läpi.

Mutta se olisi silti väärin. Tarkoitus olisi käyttää tuota operaattoria tähän tapaan.

$date >= "2022-04-01" && $date <= "2022-04-05"

Eli tuon tulos on tosi, kun päivämäärä on noiden kahden päivämäärän välissä.

hessu007 [20.06.2022 11:02:03]

#

vinkki ja apuja Tarkoitit:

strpos($row['Date'], >= '2022-04-02') !== false && strpos($row['Date'], <= '2022-04-04') !== false;

Tämä ei nimittäin toimi

hessu007 [20.06.2022 11:12:48]

#

No niin ratkaistu näin (kuten opastitikin)

$dates = $row['Date'] >= "2022-04-02" && $row['Date'] <= "2022-04-04";
return $dates;

Kiitos


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta