Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Przekonwertowanie pliku z danymi .txt do bazy mysql
Forum PHP.pl > Forum > Przedszkole
qqwwq
Witam,

Mam plik txt z wiadomościami sms, który ma zawartość wyglądającą tak:

Kod
---------------------------

11 Czerwiec 2010 11:16
od: Autor

Treść Sms'a

---------------------------

11 Czerwiec 2010 11:26
od: Autor2

Treść Sms'a

---------------------------

11 Czerwiec 2010 11:30
od: Autor1

Treść Sms'a

---------------------------


W jaki sposób mogę napisać sobie jakiś skrypcik w php, aby w pętli mi przerobił cały plik, i po kolei odczytał dzień, miesiąc, rok oraz godzinę, po czym autora i treść sms'a, zapisał sobie to wszystko do zmiennych, i na końcu na podstawie zmiennych będę w stanie dodać sobie nowy wpis do bazy - i tak w kółko w pętli aż do przerobienia całego pliku, z uwzględnieniem że ten ciąg znaków ---- oddziela kolejne sms'y.

Za każdą wskazówkę, albo może przykładowy prosty kod, będę niezmiernie wdzięczny.


Pozdrawiam.
lukasz_matysek
otwierasz sobie plik:
  1. $nazwa_pliku = "sms.txt";
  2. if ($plik = fopen($nazwa_pliku, "r")){
  3. $dane = file($nazwa_pliku);
  4. fclose($plik);
  5. } else echo "Nie mogę nawiązać połączenia z plikiem...";


i w ten sposób otrzymujesz zawartość pliku w arrayu o nazwie $dane. Dalej:

  1. foreach ($dane as $linijka)
  2. {
  3. if ($linijka ...... //tutaj wstawiasz warunek, który umożliwia zidentyfikowanie konkretnej linijki
  4. }


Na przykład linijkę z nadawcą możesz poznać po tym, że na początku ma "od:". Zainteresuj się funkcjami działającymi na stringach.
Tak w ogóle na sam początek na twoim miejscu pousuwałbym w tym pliku wszystkie puste linijki. Wtedy obróbka byłaby bardzo ułatwiona - bo wiesz że zawsze w pierwszej linijce masz datę, w drugiej nadawcę, w trzeciej treść sms'a a linijkę z kreskami traktujesz jako punkt odniesienia.
qqwwq
Dziękuję za kody, ale miał bym jeszcze pytanie co dokładnie w tym foreach mam wpisać. Znalazłem sobie całą listę funkcji działających na stringach w manualu php, ale nic one mi nie mówią. Mniej więcej też wiem co chciał bym zrobić, ale nie wiem jak to w kodzie już gotowym ma wyglądać, jakie to funkcje itp, oraz czy jest to w ogóle możliwe, czy czasem nie robię tego od tyłka strony ...

  1. foreach ($dane as $linijka){
  2. if($linijka[ma na początku dwa znaki/dwie liczby] and [po spacji jakiś ciąg znakow] and [po kolejnej spacji 4 znaki] and [po kolejnej spacji 2 znaki : i znowu dwa znaki, albo że do końca linijki znajduje się jeszcze znak ':']){
  3. $day = $linijka[pierwsze dwa znaki];
  4. $month = $linijka[po spacji jakiś ciąg znakow];
  5. $year = $linijka[po kolejnej spacji 4 znaki];
  6. $hour = $linijka[po kolejnej spacji 5 znakow];
  7.  
  8. $month = month($month); // jakas funkcja co mi zamieni nazwe miesiaca na liczbe
  9. $date = $day . $month . $year . ' ' . $hour; // jakos sformatowana data, aby pozniej mozna bylo po niej sortowac zapytania do bazy
  10. }
  11. if($linijka[pierwsze 3 znaki] == 'od:']{
  12. $autor = $linijka[ciag znakow po pierwszej spacji, albo ciag znakow od 4 - do konca liniji];
  13. }
  14. if($linijka == '---------------------------'){
  15. $insert = @mysql_query("INSERT INTO `sms` (`autor`, `date`, `content`) VALUES ('$autor', '$date', '$content')");
  16. mysql_close($connection);
  17. break; return; // questionmark.gif aby po znalezieniu tego ciagu znakow, petla sie zakonczyla i rozpoczela od nowa, aby kolejny sms zostal odczytany i dodany do bazy
  18. }
  19. else{
  20. $content = $linijka;
  21. }
  22. }
bastard13
  1. <?php
  2. $nazwa_pliku = "tekst.txt";
  3. if ($plik = fopen($nazwa_pliku, "r")) //otwiera plik do odczytu
  4. { $dane = file_get_contents($nazwa_pliku); //odczyt całej zawartości pliku bez podziału na linie
  5. fclose($plik); //zamyka plik
  6. }
  7. $dane=explode('---------------------------',$dane); //tworzenie tablicy, której elementami są pojedyncze smsy
  8. foreach($dane as $sms) //dla każdego sms'a
  9. { $sms = preg_split('/\r\n|\r/',$sms); //dzieli sms'a na pojedyncze linie
  10. $content=array();
  11. $i=0;
  12. foreach($sms as $sms_line) //usuwanie pustych lini
  13. { if($sms_line!='') //jeżeli linia nie jest pusta to wpisz do zmiennej $content
  14. $content[$i++]=$sms_line;
  15. }
  16. $i=0;
  17. //operacje na danych: $content[0] - data; $content[1] - autor; $content[2] - treść
  18. }
  19. ?>
qqwwq
Serdeczne dzięki! Już jest super. Tylko w takim wypadku, datę mam w formacie np: 11 Czerwiec 2010 11:26, a autora ( $content[1] ) jako - od: Autor2? Jak w takim wypadku mogę dalej dzielić, aby np, usunąć te pierwsze 4 znaki 'od: ' z autora, oraz jak mogę datę podzielić? Czy też nie muszę tego robić, i mam całą taką datę zapisać do bazy, i bez problemu później będę mógł po niej sortować?
bastard13
1) Usuwanie części stringa:
http://www.php.net/manual/pl/function.substr.php
2) O datach w mysql:
http://dev.mysql.com/doc/refman/5.0/en/data-types.html
3) Operacje na datach:
http://dev.mysql.com/doc/refman/5.0/en/dat...-functions.html
4) Dzielenie stringów:
http://php.net/manual/en/function.explode.php

Poczytaj, zrozum, popróbuj, a jak po twórczym skrypcie będziesz miał jeszcze jakieś pytania to pytaj.
qqwwq
Udało się, skrypcik w 2 sekundy przerobił 300 sms'ów na localhoście:

Kod
<?php
$nazwa_pliku = "sms.txt";
if ($plik = fopen($nazwa_pliku, "r"))      //otwiera plik do odczytu
{    $dane = file_get_contents($nazwa_pliku);     //odczyt całej zawartości pliku bez podziału na linie
    fclose($plik);                               //zamyka plik
}
$dane=explode('---------------------------',$dane);     //tworzenie tablicy, której elementami są pojedyncze smsy

include("config.php");

foreach($dane as $sms)                     //dla każdego sms'a
{    $sms = preg_split('/\r\n|\r/',$sms);                 //dzieli sms'a na pojedyncze linie
    $content=array();
    $i=0;
    foreach($sms as $sms_line)                            //usuwanie pustych lini
    {    if($sms_line!='')                                     //jeżeli linia nie jest pusta to wpisz do zmiennej $content
        $content[$i++]=$sms_line;
    }
    $i=0;
    
    //operacje na danych: $content[0] - data; $content[1] - autor; $content[2] - treść
    $autor = substr($content[1], 4);
    $date1 = substr($content[0], 6, 4);
    $date2 = substr($content[0], 3, 2);
    $date3 = substr($content[0], 0, 2);
    $time1 = substr($content[0], 11, 2);
    $time2 = substr($content[0], 14, 2);
    $date = $date1.'-'.$date2.'-'.$date3.'';
    $time = $time1.':'.$time2.':00';
    $content = $content[2];

    $insert = @mysql_query("INSERT INTO `sms` (`sms_id`, `sms_autor`, `sms_date`, `sms_time`, `sms_content`) VALUES ('', '$autor', '$date', '$time', '$content')");            

}
?>


Mam tylko jeszcze pytanie. Datę mam w formacie YYYY-MM-DD, oraz godzinę w formacie HH:MM:SS ... czy w jakiś sposób mogę sortować wyniki wedle obu tych pól? Tzn. abym miał wynik zapytania posortowany nie tylko wedle daty, ale także godziny, obecnie mam samą datę:

Kod
$sql = "SELECT `sms_id`, `sms_autor`, `sms_date`, `sms_time`, `sms_content`, `sms_special` FROM `sms` ORDER BY `sms_date` ASC;";
bastard13
W ten sposób sortuje ci wpierw po dacie, a następnie po czasie:
  1. $sql = "SELECT `sms_id`, `sms_autor`, `sms_date`, `sms_time`, `sms_content`, `sms_special` FROM `sms` ORDER BY `sms_date`,`sms_time`;"
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.