Как импортировать TXT в MySQL прямой или через PHP - PullRequest
1 голос
/ 12 февраля 2012

Мне нужно импортировать мой .txt в MySQL ` который имеет только одно поле как это у меня есть много попыток, но не получилось :(

enter image description here

Не могли бы вы помочь мне, пожалуйста Если есть идея с php, это тоже приемлемо. Я трачу два на это, к сожалению, пока не удалось :(

Заранее спасибо

Ответы [ 5 ]

3 голосов
/ 12 февраля 2012

Вы можете использовать Mysql LOAD DATA LOCAL INFILE синтаксис

LOAD DATA LOCAL INFILE '/path/to/file.txt' 
    INTO TABLE 'table1'
    LINES TERMINATED BY '\n'

Для этого убедитесь, что Mysql имеет доступ к /path/to/file.txt.Кроме того, пользователь, выполняющий запрос, должен иметь привилегию FILE .

С Pure PHP это просто.Прочитайте файл, постройте запрос, выполните его.Вам нужно построить запрос так, чтобы он не заканчивался зацикливанием запроса, который является медленным.

$data = file("/path/to/file.txt", FILE_SKIP_EMPTY_LINES);

// make sure you have valid database connection prior to this point.
// otherwise mysql_real_escape_string won't work
$values = "('". implode("'), ('", array_map('mysql_real_escape_string', $data)). "')";

$query = "INSERT INTO `TABLE1` (`COLUMN1`) VALUES $values";

// Now just execute the query once.
mysql_query($query);
1 голос
/ 12 февраля 2012

Использование импорта CSV в phpMyAdmin

phpMyAdmin поддерживает CSV-файлы импорт, посмотрите эту статью для получения более подробной информации (первый результат после: phpMyAdmin csv)

Использование mysqlimport

Mysql предоставляет приложение CLI, mysqlimport , пример использования (снова CSV):

mysqlimport --fields-optionally-enclosed-by='"' --fields-terminated-by=, \
    --lines-terminated-by="\r\n" --user=YOUR_USERNAME --password \
    YOUR_DATABASE YOUR_TABLE.csv

Mysql LOAD DATA

Сам Mysql (клиент, запрос) поддерживает команду LOAD DATA INFILE, пример синтаксиса:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

Создание SQL-запроса с помощью php (и вставка вручную)

Вы проанализируете текстовый файл в php, и в результате будет получен один большой оператор INSERT (это будет полезно, если / если вы не можете подключиться к mysql с сервера, на котором вы запускаете скрипт:

// This will escape values correctly
function escapeValues( &$val){
    // mysql_real_escape_string is not an option (remote server not accessible
    // in this case)
    return "'" . addslashes( $val) . "'"; 
}

$fp = fopen( $filename, 'r') or die( 'Cannot open');
$result = array();
while( $row = fgets( $fp)){
    $values = explode( '/', $row);
    array_walk( $values, 'escapeValues');
    $results[] = '(' . implode( ', ', $values) . ')';
}

fclose( $fp);

if( !count( $results){
   die();
}

echo 'INSERT INTO tableName (col1, col2, ... colN) VALUES ';
echo implode( ",\n", $results);
echo "\n";

Прямое подключение и прямой импорт

Это должно быть лучшим подходом для вас.

$conn = mysql_connect( ...) or die(...);
mysql_select_db(...);

// Now we need to build small class which will allow us escape values properly
// mysql_escape_string is DEPRECATED and mysql_real_escape_string
// requires connection parameter
// Ps: choose better name
class CallbackHack {
    public $connection = null;
    public function escapeValue( &$val){
        $val = "'" . mysql_real_escape_string( $val, $this->connection) . "'";
    }
}
$hack = new CallbackHack();
$hack->connection = $conn;

$fp = fopen( $filename, 'r') or die( 'Cannot open');
mysql_query( 'BEGIN TRANSACTION;'); // Increases insert performance for InnoDb
while( $row = fgets( $fp)){
    $values = explode( '/', $row);
    array_walk( $values, array( $hack, 'escapeValue'));
    $sql = 'INSERT INTO tableName (col1, col2, ... colN) VALUES (' .
            implode( ', ', $values) . ');';
    mysql_query( $sql);
}

mysql_query( 'COMMIT;'); // Make sure it will run
fclose( $fp);
1 голос
/ 12 февраля 2012

Почему бы не использовать некоторое регулярное выражение, чтобы разделить его по новым строкам, например.

$array = preg_split("/[\r\n]+/", file_get_contents("path/to/file.txt"));

, а затем выполните цикл foreach, то есть:

foreach($array as $line){
   // insert into database
}

Тогда все, что вам нужно сделать, это заполнить строку выше, где вы вставляете ее в правильное поле в базе данных, строка за строкой - но, пожалуйста, продезинфицируйте каждую строку, просто чтобы не вводить в базу данных что-нибудь плохое!

0 голосов
/ 12 февраля 2012
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("my_db", $con);


$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
    //Output a line of the file until the end is reached

    while(!feof($file))
      {

$data = mysql_real_excape_string(fgets($file));
mysql_query("INSERT INTO Persons (filedata)
VALUES ($data)");
//make sure above query is right according to your table structure
      }
    fclose($file);

mysql_close($con);
?> 
0 голосов
/ 12 февраля 2012
<?php
$array = preg_split("[\r\n]+", file_get_contents("path/to/file.txt"))

foreach ($array as $line) {
mysql_query("INSERT INTO `dbname` (colmun1) VALUES ('$line')");
}
?>

Всегда санируйте тоже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...