Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam! Mam taki problem odnośnie wyciągania danych z pliku w php:
Zrobiłem taki skrypt wyciągający dane z pliku tekstowego który zawiera informacje na temat 20 użytkowników. Wpis pliku tekstowego dokładnie wygląda tak: najpierw jest id użytkownika a poniżej informacje o nim czyli:
id1 Janek
---- informacje dane dane
---- dalsze dane dalsze dane informacje
---- itd.
id2 Bogdan
---- informacje dane dane
---- dalsze dane dalsze dane informacje
---- jeszcze więcej informacji niż u janka
---- itd.
id3 Adrian
---- informacje dane dane
---- dalsze dane dalsze dane informacje
---- dalsze inf.
---- itd.
użyłem do tego tablic wygląda to tak:
<?
$fd = fopen("/var/www/plik.txt", "r");
while (!feof ($fd)) {
$BUFFER[] = fgets($fd, 152);
}
echo $BUFFER[0] = str_replace(' ', ' ', $BUFFER[0]);
echo "<br>";
echo $BUFFER[1] = str_replace(' ', ' ', $BUFFER[1]);
echo "<br>";
echo $BUFFER[2]= str_replace(' ', ' ', $BUFFER[2]);
echo "<br>";
echo $BUFFER[3]= str_replace(' ', ' ', $BUFFER[3]);
echo "<br>";
echo $BUFFER[4]= str_replace(' ', ' ', $BUFFER[4]);
echo "<br>";
echo $BUFFER[5]= str_replace(' ', ' ', $BUFFER[5]);
echo "<br>";
echo $BUFFER[6]= str_replace(' ', ' ', $BUFFER[6]);
echo "<br>";
echo $BUFFER[7] = str_replace(' ', ' ', $BUFFER[7]);
echo "<br>";
itd.
?>
czyli wyciąga mi po linijce dane z pliku tekstowego.
I wszystko jest ok! Tylko problem pojawia się przy wydruku ponieważ
przypuszczalnie jak wydrukuje A4 to na jednej stronie mam dane trzech użytkowników na drugiej np dane następnych trzech użytkowników w zależności ile użytkownik ma danych.
I mam takie pytanie czy jest taka możliwość żeby dane jednego użytkownika były na jednej stronie, dane drugiego na drugiej trzeciego na trzeciej itd a nie jeden pod drugim na jednej stronie.
Był bym bardzo wdzięczny za jakiekolwiek informacje:)
Offline
Tak, to jest możliwe. Jednym ze sposobów jest użycie CSS2. Zainteresuj się właściwościami "page-break-before", "page-break-inside" oraz "page-break-after".
Offline
okej! dobra opcja tylko jakiego wpisu użyć aby przypuszczalnie uciął mi stronę przy:
id1 Janek
---- adres
----- dane 1
----- dane 2
i ucina mi stronę po dane 2
Offline
Każdą taką grupę danych obejmij znacznikami - span, table etc. Teraz dwie opcje do wyboru:
- każdej grupie oprócz pierwszej nadaj właściwość "page-break-before = always;" (albo inna wartość, zależy od ciebie),
- każdej grupie oprócz ostatniej nadaj właściwość "page-break-after = always;" (jak wyżej).
Offline
tylko sprawa wygląda tak że on dzięki tablicom wyciągając linie po lini z danymi wystawia je na przeglądarce i chodzi o to żeby przypuszczalnie gdy u kogoś będzie wpis np dane 40 i będzie to ostatni wpis dla tego użytkownika to żeby ucinał tą stronę i następnego już umieszczał na następnej. Bo wygląda to tak że za drugim wczytaniem z pliku ktoś może mieć więcej danych czyli ilość danych na każde wczytanie niejest określona a jak ustawie mu co ileś to on zawsze będzie mi ucinał w tym samym miejscu.
Offline
dlatego Contravene pisal o grupach, wszystkie dane uzytkownika umieszczasz w jednej grupie i lamiesz strone przed/po niej, to ile wewnatrz znajdzie sie danych nie ma znaczenia
Offline
No tak tylko niewiem czy sie dobrze zrozumieliśmy: Contravene napisał żeby objąć każdą grupę znacznikami! z tego co zrozumiałem każda grupa to uzytkownik i jego dane. Z tym że nieidzie określić gdzie kończy się dana grupa dlatego że po kolejnym zaciągnięciu danych z nowowygenerowanego pliku danych tych może byc więcej. Chyba że żle rozumie??może by mi to ktoś wytłumaczył uzywając tego w tym kodzie??
<?
$fd = fopen("/var/www/plik.txt", "r");
while (!feof ($fd)) {
$BUFFER[] = fgets($fd, 152);
}
echo $BUFFER[0] = str_replace(' ', ' ', $BUFFER[0]);
echo "<br>";
echo $BUFFER[1] = str_replace(' ', ' ', $BUFFER[1]);
echo "<br>";
echo $BUFFER[2]= str_replace(' ', ' ', $BUFFER[2]);
echo "<br>";
echo $BUFFER[3]= str_replace(' ', ' ', $BUFFER[3]);
echo "<br>";
echo $BUFFER[4]= str_replace(' ', ' ', $BUFFER[4]);
echo "<br>";
echo $BUFFER[5]= str_replace(' ', ' ', $BUFFER[5]);
echo "<br>";
echo $BUFFER[6]= str_replace(' ', ' ', $BUFFER[6]);
echo "<br>";
echo $BUFFER[7] = str_replace(' ', ' ', $BUFFER[7]);
echo "<br>";
itd.
?>
bo może być tak że :
echo $BUFFER[0] = str_replace(' ', ' ', $BUFFER[0]); wyciągnie mi linie z - id1 Janek
echo "<br>";
echo $BUFFER[1] = str_replace(' ', ' ', $BUFFER[1]); wyciągnie dane z adresem
echo "<br>";
echo $BUFFER[2]= str_replace(' ', ' ', $BUFFER[2]); wyciągnie dane zainteresowania
echo "<br>";
echo $BUFFER[3]= str_replace(' ', ' ', $BUFFER[3]);
echo "<br>";
echo $BUFFER[4]= str_replace(' ', ' ', $BUFFER[4]);
a na drugi dzień przypuszczalnie jak plik się zmieni i Janek bedzie miał mniej danych to wyciągnie z lini drugiej:
echo $BUFFER[2]= str_replace(' ', ' ', $BUFFER[2]); id2 następny użytkownik
ponieważ w tym miejscu w pliku już niebędzie danych z zainteresowaniami pierwszego uzytkownika tylko dane drugiego.
Może ja nierozumie ale jak to objąć znacznikami w takim razie żeby było tak jak mówicie??
Offline
Może jest taka mozliwość że :
jesli znajdzie przypuszczalnie jakis znak lub słowo np id3 to łamie strone i po tym zaczyna od nowej??? to by chyba najprościej rozwiazało sprawę
Offline
w pliku tekstowym musisz wpisywac cos co jednoznacznie bedzie identyfikowalo miejsce podzialu (jesli to idxxx bedzie takim ciagiem to jak najbardziej moze byc, tylko jesli w danych pojawi sie idxxx to bedzie zonk, x = cyfra) badz tez cos co bedzie okreslalo czy dany wiersz zawiera identyfikator uzytkownika czy informacje o nim, np kazdy wiersz z identyfikatorem moglby sie zaczynac od I: a z danymi od D: wtedy po kolei wczytujac linijki srpawdzasz czy nie wczytano linii z poczatkiem "I:" jesli wczytano to konczysz poprzednia grupe i zacyznasz nastepna. Oczywiscie za kazdym razem musialbys wycinac poczatkowe dwa znaki.
Offline
Noo ok:)! ze znacznikiem nie było by problemu ponieważ w danych niebędzie występować taki sam jak początkowy. Tylko jaka opcją zrobić cos takiego?? Dalej przez page-break-before = always????
Offline
aby w kodzie php ustalic czy trwa rekord czy nie sprawdzasz poczatkowe znaki kazdej wczytanej linii i jezeli jest to id... to zaczyna sie rekord (i wstawiasz zanczik otwierajacy "ubieranie" rekordu) oraz jezeli wczesniej byl rekord (kontrolujesz to jakas zmienna) przed nim zamykajacy poprzedni ...
Offline
No to spoko! tylko czy jest ktoś w stanie po krótce mi pokazać na tym kodzie jak to zorbić mniej więcej??
Offline
Czytanie linia po linii prosto z manuala (php.net):
<?php
$uchwyt = @fopen ("/tmp/inputfile.txt", "r");
if ($uchwyt) {
while (!feof($uchwyt)) {
$buffer = fgets($uchwyt, 4096);
echo $buffer;
}
fclose ($uchwyt);
}
?>
teraz tylko zrobisz sprawdzanie co jest w linii. Nie lepiej ustalić tabelkowy układ pliku np.
id1|tekst1|tekst2|tekst3
id2|tekst1|tekst2|tekst3
wtedy łatwo rozdzielić stringa po znaku | przy pomocy explode().
Swoją drogą to po to są bazy danych, żeby sobie ułatwić życie i nie bawić się plikami.
Offline
w ukladzie jaki masz obecnie:
<? $first=true; $fd = fopen("/var/www/plik.txt", "r"); while (!feof ($fd)) { $BUFFER = fgets($fd, 152); if ($BUFFER[1]=="i" && $BUFFER[2]=="d") { if (! $first) echo "</div>"; $first=false; echo "<div>" . str_replace(' ', ' ', $BUFFER) } else if ($BUFFER[1]=="-" && $BUFFER[2]=="-") { echo str_replace(' ', ' ', $BUFFER); } else echo ERROR; } echo "</div>" ?>
(kod nietestowany, pisany z pamieci)
Offline
hmmm przy tym kodzie:
<?
$first=true;
$fd = fopen("/var/www/plik.txt", "r");
while (!feof ($fd)) {
$BUFFER = fgets($fd, 152);
if ($BUFFER[1]=="i" && $BUFFER[2]=="d") {
if (! $first) echo "</div>";
$first=false;
echo "<div>" . str_replace(' ', ' ', $BUFFER)
} else if ($BUFFER[1]=="-" && $BUFFER[2]=="-") {
echo str_replace(' ', ' ', $BUFFER);
} else
echo ERROR;
}
echo "</div>"
?>
wyrzuca mi ciągiem:
ERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERROR
i niewiem jak to rozgryść??
Offline
ooo nawet inaczej dałem mu tablice od 0 czyli:
<?
$first=true;
$fd = fopen("/var/www/plik.txt", "r");
while (!feof ($fd)) {
$BUFFER = fgets($fd, 152);
if ($BUFFER[0]=="i" && $BUFFER[1]=="d") {
if (! $first) echo "</div>";
$first=false;
echo "<div>" . str_replace(' ', ' ', $BUFFER)
} else if ($BUFFER[0]=="-" && $BUFFER[1]=="-") {
echo str_replace(' ', ' ', $BUFFER);
} else
echo ERROR;
}
echo "</div>"
?>
i teraz mi wyrzuca:
id1 Janek ERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERRORERROR
( w jednej lini)
czyli czemu wyrzuca mi tylko początkowe dane?? i jeszcze jedno mnie zastanawia czemu tam jest :
($BUFFER[0]=="i" && $BUFFER[1]=="d")
rozumie że i oraz d ale id jest tylko w pierwszej lini! widze że kod jest konkretny tylko sie troche pogubiłem.
nierozumie tez myslników:
else if ($BUFFER[0]=="-" && $BUFFER[1]=="-")
Offline
1. sory za indeksowanie tablic ... ale ostatnio pisze w takim austriackim ustrojswie ze tablice indeksuje sie od 1
2. bo wlasnie chodzi o to aby odroznic pierwszy wiersz rekordu (zaczynajacy sie od id) od kolejnych - zaczynajacych sie jak podales od myslnikow ....
3. czy wyrzuca tylko id1 czy kolejne takze ?
4. zamien moze echo ERROR; na echo "ERROR ($BUFFER)<br />"; wtedy bedziemy widzieli jakie linie odrzuca ...
5. po echo "<div>" . str_replace(' ', ' ', $BUFFER) powinien byc srednik ...
Offline
Ech. Jednak to bez znaczenia czy jest tak:
echo str_replace(' ', ' ', $BUFFER);
czy tak:
str_replace(' ', ' ', $BUFFER); echo $BUFFER;
Sory za wprowadzanie w błąd. str_replace() jednak zwraca zmieniony string, wydawało mi się że zwraca tylko true gdy nastąpi zmiana. Mój błąd.
Offline
Udało się:) po lekkim przerobieniu kodu wszystko wyszło ok!:) dzięki za pomoc:) skrypt wygląda tak:
<?
$first=true;
$fd = fopen("/var/www/apache2-default/plik.txt", "r");
while (!feof ($fd)) {
$BUFFER = fgets($fd, 152);
if ($BUFFER[0]=="i" && $BUFFER[1]=="d") {
if (! $first) echo "</div>";
$first=false;
echo "<div>" . str_replace(' ', ' ', $BUFFER);
} else if ($BUFFER) {
echo str_replace(' ', ' ', $BUFFER);
} else
echo ERROR;
}
echo "</div>"
?>
</b>
z czego po body wpis CSS:
<style type="text/css"><!--
div { page-break-after: always; }
--></style>
i już ucina mi strone dokładnie w momencie id także jest ok!!mysle że skrypt także komuś sie przyda:)
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00100 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.138.135.4' WHERE u.id=1 |
0.00065 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.138.135.4', 1732303767) |
0.00048 | SELECT * FROM punbb_online WHERE logged<1732303467 |
0.00050 | SELECT topic_id FROM punbb_posts WHERE id=46659 |
0.00174 | SELECT id FROM punbb_posts WHERE topic_id=6062 ORDER BY posted |
0.00065 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=6062 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00096 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=6062 ORDER BY p.id LIMIT 0,25 |
0.00087 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=6062 |
Total query time: 0.00704 s |