Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt importujący csv/sql do bazy mysql
Forum PHP.pl > Forum > Gotowe rozwiązania
Fixer
Witam

Szukam skryptu PHP który:

1. wypakuje z serwera plik *.gz (gzip)
2. wypakowany plik w formacie csv zaimportuje do bazy mysql
3. skrypt podczas importu bedzie odporny na time_limit
4. musi działać szybko (szybko importować dane)
4. mile widziany jakiś pasek postępu w czasie pracy...

No dobra napisałem coś swojego na własny użytek. Skrypt jest przytosowany raczej do moich szczególnych potrzeb ale po drobnych poprawkach może być do ogólnego zastosowania również, kodzik umieszczam dla potomnych, może się komuś przyda...

Konfiguracja: wszystko w pliku config.inc.php
Wywołanie: import.php
Struktura importowanego pliku csv: każde pojedyńcze słowo w osobnej linijce

Struktura mysql:
  1. DROP TABLE IF EXISTS `slownik_pl`;
  2. CREATE TABLE IF NOT EXISTS `slownik_pl` (
  3. `slowo` varchar(45) character SET latin2 collate latin2_bin NOT NULL DEFAULT '',
  4. PRIMARY KEY (`slowo`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;


config.inc.php
  1. <?php
  2.  
  3. // ustawienia dla serwera
  4. ini_set("post_max_size","201M");
  5. ini_set("upload_max_filesize","200M");
  6. ini_set("memory_limit","202M");
  7. //error_reporting(4095);
  8.  
  9. // ustawienia dla mysql'a
  10. $sql_serwer = "localhost:3306";
  11. $sql_user = "";
  12. $sql_password = "";
  13. $sql_baza = "";
  14. $sql_tabela = "";
  15.  
  16. // ustawienia dla kodowania
  17. $kodowanie1="latin2"; //utf-8
  18. $kodowanie2="latin2_general_ci"; //utf_polish_ci
  19.  
  20. // plik do zaimportowania
  21. $plik = ("slownik_pl.csv");
  22.  
  23. // ustawienia skryptu
  24. $czy_usunac = 1; // czy mam wyczyscic tabele przed importem (1-tak, 0-nie)
  25. $czy_posortowac = 0; // czy po zaimportowaniu baza ma zostać posortowana alfabetycznie, moze to trwać b
  26. rdzo dlugo (-tak, 0, nie, domyslnie 0)
  27. $czy_indeksowac = 1; // moze trwac dlugo (1-tak, 0-nie)
  28. $konwersja = 0; //0-brak, 1-z ISO-8859-2 na UTF-8, 2-z UTF-8 na ISO-8859-2
  29.  
  30. $rekordow = 0; // ma być zawsze 0
  31.  
  32. /*
  33. $funkcja_iconv = false; // ma być zawsze 0
  34.  
  35. if (function_exists('iconv')) {
  36.   $funkcja_iconv = true;
  37. } else {
  38. $funkcja_iconv = false;
  39.   }
  40. */
  41.  
  42. ?>


funkcje.inc.php
  1. <?php
  2. function win2utf(){
  3.  $tabela = Array(
  4. "xb9" => "xc4x85", "xa5" => "xc4x84", "xe6" => "xc4x87", "xc6" => "xc4x86",
  5. "xea" => "xc4x99", "xca" => "xc4x98", "xb3" => "xc5x82", "xa3" => "xc5x81",
  6. "xf3" => "xc3xb3", "xD3" => "xc3x93", "x9c" => "xc5x9b", "x8c" => "xc5x9a",
  7. "x9f" => "xc5xbc", "xaf" => "xc5xbb", "xbf" => "xc5xba", "xac" => "xc5xb9",
  8. "xf1" => "xc5x84", "xD1" => "xc5x83");
  9.  return $tabela;
  10. }
  11.  
  12. function iso2utf(){
  13.  $tabela = Array(
  14. "xb1" => "xc4x85", "xa1" => "xc4x84", "xe6" => "xc4x87", "xc6" => "xc4x86",
  15. "xea" => "xc4x99", "xca" => "xc4x98", "xb3" => "xc5x82", "xa3" => "xc5x81",
  16. "xf3" => "xc3xb3", "xD3" => "xc3x93", "xb6" => "xc5x9b", "xa6" => "xc5x9a",
  17. "xbc" => "xc5xbc", "xac" => "xc5xbb", "xbf" => "xc5xba", "xaf" => "xc5xb9",
  18. "xf1" => "xc5x84", "xD1" => "xc5x83");
  19.  return $tabela;
  20. }
  21.  
  22. function ISO88592_2_UTF8($tekst){
  23.  return strtr($tekst, iso2utf());
  24. }
  25.  
  26. function UTF8_2_ISO88592($tekst){
  27.  return strtr($tekst, array_flip(iso2utf()));
  28. }
  29.  
  30. function WIN1250_2_UTF8($tekst){
  31.  return strtr($tekst, win2utf());
  32. }
  33.  
  34. function UTF8_2_WIN1250($tekst){
  35.  return strtr($tekst, array_flip(win2utf()));
  36. }
  37.  
  38. function ISO88592_2_WIN1250($tekst){
  39.  return strtr($tekst, "xa1xa6xacxb1xb6xbc", "xa5x8cx8fxb9x9cx9f");
  40. }
  41.  
  42. function WIN1250_2_ISO88592($tekst){
  43.  return strtr($tekst, "xa5x8cx8fxb9x9cx9f", "xa1xa6xacxb1xb6xbc");
  44.  
  45. }
  46. ?>
  47.  
  48. <?php
  49. /*
  50.   echo WIN1250_2_ISO88592('ten tekst będzie skonwertowany: ą ź Ą ś ł'); // Windows-1250 na ISO-8859-2
  51.  
  52.   echo '<br>'.ISO88592_2_UTF8('ten tekst będzie skonwertowany: ą ć ż Ą Ę Ó Ł Ż Ź ó ł ń Ń'); // ISO-8859-2 na UTF-8
  53.  
  54.  
  55. Aby skonwertować z UTF-8 na ISO-8859-1 można skorzystać z funkcji "utf8_decode" a z ISO-8859-1 na UTF-8 z funkcji "utf8_encode"
  56.  
  57. Ostatnio przydało mi się to bardzo i mam nadzieję że przyda się to jeszcze komuś
  58. więc to tu zamieszczam :)
  59.  
  60. */
  61.  
  62. ////////////////////////////////////////
  63.  
  64. function compress( $srcFileName, $dstFileName )
  65. {
  66. // getting file content
  67. $fp = fopen( $srcFileName, "r" );
  68. $data = fread ( $fp, filesize( $srcFileName ) );
  69. fclose( $fp );
  70.  
  71. // writing compressed file
  72. $zp = gzopen( $dstFileName, "w9" );
  73. gzwrite( $zp, $data );
  74. gzclose( $zp );
  75. }
  76. //compress("/web/myfile.dat", "/web/myfile.gz"); 
  77.  
  78. function uncompress($srcName, $dstName) {
  79. $string = implode("", gzfile($srcName));
  80. $fp = fopen($dstName, "w");
  81. fwrite($fp, $string, strlen($string));
  82. fclose($fp);
  83. }
  84.  
  85. //uncompress("./myfile.txt.gz", "./myfile.txt");
  86.  
  87.  
  88. ?>


import.php
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  5. <title>Import danych słownikowych</title>
  6. </head>
  7.  
  8. <body>
  9. <?php
  10.  
  11. /*
  12.    Importowanie dużych plików w formacie CSV
  13. */
  14.  
  15. ////////////////////////////////////////////////////////////////////
  16. require_once('config.inc.php');
  17. require_once('funkcje.inc.php');
  18. ////////////////////////////////////////////////////////////////////
  19.  
  20. // data
  21. $nd = array("niedziela","poniedziałek","wtorek",
  22. "&para;roda","czwartek","pi&plusmn;tek","sobota");
  23.  
  24. $nm = array("stycznia","lutego","marca","kwietnia",
  25. "maja","czerwca","lipca","sierpnia","wrze&para;nia",
  26. "paĽdziernika","listopada","grudnia");
  27.  
  28. echo "Data rozpoczęcia importu: ". $nd[date("w")];
  29. echo ", ".date("j")." ".$nm[date("m")-1];
  30. echo " ".date("Y")." roku, godzina: ".date("H:i:s")."<br /><br />";
  31. echo "Importowany plik to: <strong>".$plik."</strong> <br /><br />";
  32.  
  33. ///////////////////
  34.  
  35. //czas start
  36. $gentime = microtime(); 
  37. $gentime = explode(' ',$gentime); 
  38. $gentime = $gentime[1] + $gentime[0]; 
  39. $pg_start = $gentime;
  40.  
  41. ///////////////////
  42.  
  43. /*
  44. $db = mysql_connect
  45. (!mysql_select_db("magazyn",$db))
  46. mysql_affected_rows($db)
  47. fgetcsv
  48. */
  49.  
  50. if (mysql_connect($sql_serwer, $sql_user, $sql_password)
  51. and mysql_select_db($sql_baza)) {
  52.  
  53. mysql_query("SET CHARACTER SET $kodowanie1");
  54. mysql_query("SET collation_connection = $kodowanie2");
  55.  
  56. if ($czy_usunac = 1) {
  57. mysql_query("TRUNCATE TABLE $sql_tabela");
  58. }
  59.  
  60. if ( (!file_exists("./tmp/$plik")) AND (filesize(./tmp/$plik)=0) ) {
  61. //mkdir("./tmp/", 0777);
  62. chmod("./tmp/", 0777); // nadaje prawa czytania i zapisu dla każdego
  63. uncompress("./$plik.gz", "./tmp/$plik");
  64. }
  65.  
  66. $plik = file("./tmp/$plik");
  67.  
  68. foreach($plik as $linia) {
  69. $i++;
  70. //list($slowo) = explode('|', trim($linia));
  71.  
  72. //$komentarze = array("^--", "^---", "^#", "^;");
  73. //list($key,$kom)=each($komentarze)
  74.  
  75. if ((!eregi("^--", $linia)) OR !eregi("^#", $linia) OR !eregi("^;", $linia)) {
  76. //if (!eregi($kom, $linia)) {
  77. $linia = trim($linia); //usuwa białe z początku i z końca napisu (spacja, tabulator, nowa linia...)
  78.  
  79. /* konwertujemy wbudowaną funkcją
  80. if ($funkcja_iconv = true) {
  81. if ($konwersja = 1) {
  82. $linia = iconv("ISO-8859-2", "UTF-8", $linia);
  83. //lub $linia = mb_convert_encoding($linia, 'ISO-8859-2', 'UTF-8');
  84. }
  85. if ($konwersja = 2) {
  86. $linia = iconv("UTF-8", "ISO-8859-2//IGNORE", $linia);
  87. }
  88. } else {
  89. echo "Kodowanie nie zostało zmienione bo funkcja konwertująca iconv nie jest dost
    ępna 
  90. a tym serwerze!";
  91. }
  92. */
  93.  
  94. if ($konwersja = 1) {
  95. ISO88592_2_UTF8("$linia");
  96. }
  97.  
  98. if ($konwersja = 2) {
  99. UTF8_2_ISO88592("$linia");
  100. }
  101.  
  102. //echo ($linia.'<br />'); //DEBUG
  103.  
  104. $wynik = mysql_query("INSERT INTO $sql_tabela SET slowo='$linia'"); //$slowo
  105. $rekordow++;
  106. }
  107. if (!wynik) echo "Bł&plusmn;d w linii $i ".mysql_error()." <br />";
  108. }
  109.  
  110. //sortujemy dane w bazie
  111. if ($czy_posortowac = 1) {
  112. mysql_query("ALTER TABLE `$sql_tabela` ORDER BY `slowo`;");
  113. }
  114.  
  115. //sortujemy dane w bazie
  116. if ($czy_indeksowac = 1) {
  117. mysql_query("ALTER TABLE `$sql_tabela` ADD PRIMARY KEY ( `slowo` );");
  118. }
  119.  
  120. }
  121.  
  122. //////
  123.  
  124. //czas stop
  125. $gentime = microtime(); 
  126. $gentime = explode(' ',$gentime); 
  127. $gentime = $gentime[1] + $gentime[0]; 
  128. $pg_end = $gentime; 
  129. $totaltime = ($pg_end - $pg_start); 
  130. $showtime = number_format($totaltime, 4, '.', ''); 
  131. echo("Importowanie trwało: <strong>" . $showtime . "</strong> sekund(y)<br />");
  132. echo("Zaimportowałem: <strong>" . $rekordow . "</strong> rekordy(ów) do tabeli: <strong>".$sql_tabela."</strong><br /><br />");
  133.  
  134. echo "Data zakończenia importu: ". $nd[date("w")];
  135. echo ", ".date("j")." ".$nm[date("m")-1];
  136. echo " ".date("Y")." roku, godzina: ".date("H:i:s")."<br /><br />";
  137.  
  138. ?>
  139. </body>
  140.  
  141. </html>


Wynik wykonania skryptu:
Cytat
Data rozpoczęcia importu: piątek, 15 lutego 2008 roku, godzina: 05:45:21

Importowany plik to: slownik_pl.csv

Importowanie trwało: 1260.6495 sekund(y)
Zaimportowałem: 3336461 rekordy(ów) do tabeli: slownik_pl

Data zakończenia importu: piątek, 15 lutego 2008 roku, godzina: 06:06:22


xxx
daniel1302
Szybciej tego nie zrobisz spróbuj ręcznie tyle rekordów wgrać stronę będzie ładowało z 20 minut
Kocurro
Na czas importu wyłącz klucze, zablokuj tabelę, używaj insertów wielokrotnych. Po imporcie, włącz klucze, zregeneruj statystyki dla tabeli a następnie odblokuj tabelę.
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.