Kirjautuminen

Haku

Tehtävät

Kilpailu

Algoritmikisa
Putka Open 2020 -kisan
4. kierros: 6.–8.11.

Keskustelu: Ohjelmointiongelmat: PHP: .dat-tiedoston lukeminen oikein?

Sivu 1 / 1

Sivun loppuun

walkout_ [25.09.2020 08:48:09]

Lainaa #

Hei,

Miten voi lukea oikein .dat-tiedoston PHP:lla?

<?php
$addresses = file($datfile, FILE_SKIP_EMPTY_LINES);

$paginator = array_slice($addresses, $start, $limit, false);

Yllä olevassa koodissa siis voin muuttaa sen arrayksi. Ja paginator on tehty sentakia että itse dattiedostossa on niin paljon dataa ettei sitä voi foreach-loopata HTML-koodiksi sellaisenaan tai muuten selainlataus kestää niin kauan että ohjelma kaatuu.

Mutta ongelma on se, että .dat-tiedsoton sarakkeiden erottelu tapahtuu whitespaceilla jotka sisältävät useamman whitespancen eli esim. näin:

Field 1         Fiend 2       Field 3

Eli minun pitäsi saada srakkeista esim. juuri toi Field 1 sellaisenaan ja sitten lukea niin että PHP koodi jotekin tunnusitaa erottelun sarakkeiden välillä sitten että se huomioi että whitespaceja on useampi ja jättää yhdellä whitespacella olevat huomioimatta.

Ei ainakaan onnistu allaolevalla koodilla:

<table border="1">
	<tr>
		<td>Field 1</td>
		<td>Field 2</td>
		<td>Field 3</td>
	</tr>
<?php
foreach ($paginator as $data) {

	$explodetData = preg_split('/ +/', $data);

	echo '<tr>';
	echo '<td>'.$explodetData[0].'</td>';
	echo '<td>'.$explodetData[1].'</td>';
	echo '<td>'.$explodetData[2].'</td>';
	echo '</tr>';
}
?>
</table>

Grez [25.09.2020 09:21:33]

Lainaa #

Niin olet kirjoittanut koodiisi, että pitää olla vähintään 1 välilyönti.

Miten olisi niin että pitää olla vähintään 2 välilyöntiä:

$explodetData = preg_split('/  +/', $data);

Tai jopa tabulaattori tai vähintään 2 whitespacea

$explodetData = preg_split('/\\t|\\s\\s+/', $data);

walkout_ [25.09.2020 12:53:52]

Lainaa #

Näillä koodeilla toimii muuten mutta tutkin .dat-tiedostoa ja siellä on myös tyhjä kenttiä ja nekin on eroteltu useammalla kuin yhdellä välilyön nillä.

Kokeilin myös koodia:

<?php
echo str_replace(' ', ',', $data);
?>

Niin ainakin tämä koodi laittaa kaikkiin kohtiin vain ,-merkkiä. Joten luulen että kenttiä ei ole eroteltu tabulaattoreilla.

Grez [25.09.2020 13:23:25]

Lainaa #

No sitten täytyy vaan katsoa että onko tiedostosta jotenkin pääteltävissä mikä kenttä siellä on tyhjä ja jos on pääteltävissä niin opettaa tietokoneelle se päättelylogiikka.

Tai sitten hankkia lähtötiedot jossain järjellisessä muodossa.

walkout_ [25.09.2020 14:01:41]

Lainaa #

Niin kyseessä on eräs API. Ja luin nyt logiikan PDF-tiestosta jossa API:n kuvaus. Ja logiikka on aika monimutkainen sillä sillä on osa datasta erotelut ilmankin välilyöntiä yhteen pötköön sellaisella logiikalla, että kettä on aina tietyn pituinen merkkijono.

Grez [25.09.2020 14:12:30]

Lainaa #

Jos siitä kerran on kuvaus niin sitten varmaan kannattaa tehdä sen kuvauksen mukaan. Vakiolevyiset kentät ei ole mitenkään vaikeita tai monimutkaisia toteuttaa.

Luultavasti olisit jo saanut koko homman tehtyä jos olisit lukenut ensin API:n kuvauksen etkä lähtenyt sokkona arpomaan.

The Alchemist [25.09.2020 16:40:59]

Lainaa #

Eihän tuo speksi ainakaan oman selostuksesi mukaan ole mitenkään monimutkainen. Luet riviltä merkin kerrallaan ja päättymisehto on jotain sellaista, että 1) kohtaat kaksi perättäistä välilyöntiä, tai 2) olet lukenut sallitun enimmäismäärän merkkejä. Tyhjän kentän voinee päätellä sitten perättäisten välilyöntien määrästä kai.

walkout_ [26.09.2020 02:33:37]

Lainaa #

The Alchemist kirjoitti:

(25.09.2020 16:40:59): Eihän tuo speksi ainakaan oman selos­tuk­se­si...

API-dokumentaation mukaan jokainen .dat-tiedoston rivi on string, jossa kaikki kentät ovat eroteltu positiolla ja maksimipituudella.

Eli koodi menee näin:

foreach ($paginator as $data) {

			//echo mb_check_encoding($value)."<br />";
			//$countWhiteSpaces = substr_count($data, ' ');
			//$explodetData = preg_split('/\\t|\\s\\s+/', $data);
			//var_dump($explodetData);
			if (is_int($i/2)) { $color = "#dddddd"; } else { $color = "#ffffff";}
			echo '<tr style="background-color: '.$color.';">';
			echo '<td class="item">'.$lineNumber.'</td>';
			echo '<td class="item">'.substr($data, 0, 5).'</td>';
			echo '<td class="item">'.substr($data, 5, 8).'</td>';
			echo '<td class="item">'.substr($data, 13, 5).'</td>';
			echo '<td class="item">'.substr($data, 18, 30).'</td>';
			echo '<td class="item">'.substr($data, 48, 30).'</td>';
			echo '<td class="item">'.substr($data, 78, 12).'</td>';
			echo '<td class="item">'.substr($data, 90, 12).'</td>';
			echo '<td class="item">'.substr($data, 102, 30).'</td>';
			echo '<td class="item">'.substr($data, 132, 30).'</td>';
			echo '<td class="item">'.substr($data, 213, 3).'</td>';
			echo '<td class="item">'.substr($data, 216, 20).'</td>';
			echo '<td class="item">'.substr($data, 236, 20).'</td>';
			echo '</tr>';
			$i++;
			$lineNumber++;

		}

walkout_ [26.09.2020 03:01:18]

Lainaa #

Korjaan, että jokainen .dat-tiedoston rivi on yhtäpitkä string ja siinä on välilyönteja niin paljon kuin mahdollista ja kaikki kentät eroteltu välilyönnit mukaan lukien positiolla ja pittudella.


Sivun alkuun

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta