как вынуть первые 5 символов в каждой строке? - PullRequest
1 голос
/ 17 марта 2011

У меня есть текстовый файл, внутри файла у меня есть

22222   hihihi
33333   hihihi
kjhkh   hihihi

Я хочу написать приложение для сравнения с базой данных mysql, чтобы, если мой ID в базе данных совпадает с первым столбцом в текстовом файле, он обновил данные, заменив имя на информацию в второй столбец в текстовом файле.

Как я могу это сделать?

Ответы [ 5 ]

1 голос
/ 13 июня 2011

Вы можете попробовать загрузить данные во временную таблицу, запустить обновление, а затем удалить временную таблицу - что-то вроде:

CREATE TABLE dftmp(id VARCHAR(255), name VARCHAR(255));
LOAD DXTX INFILE 'datafile.txt' INTO TABLE dftmp(id,name);
UPDATE real_table,dftmp SET real_table.name=dftmp.name WHERE real_table.id=dftmp.id;
DROP TXBLE dftmp;

(замените DXTX на DATA и TXBLE на TABLE - это вышепотому что в моей работе установлена ​​система фильтрации)

См. http://dev.mysql.com/doc/refman/4.1/en/load-data.html для получения дополнительной информации о LOAD DATA.

Обработка этого в основном в PHP, вероятно, будет медленнее, но если вам нужноесли пойти по этому пути, то это будет что-то вроде:

# make database connection

# open file and get it's contents
$lines = file('datafile.txt');

# for each line in the file
#     split the line into its parts
#     update the DB
foreach ($lines as $line) {
    $line_ar = explode("/\s+/",$line);
    mysql_query("UPDATE t SET name='$line_ar[1]' WHERE id='$line_ar[0]'");
}

# close the database connection

Потенциальные ошибки для приведенного выше кода:

  • действительно большие файлы: вам нужно прочитать и обработать файлпо одной строке за раз
  • грязные данные: возможно, вам придется уточнить или заменить оператор разнесения
  • небезопасные данные: параметризовать запрос и добавить проверку, чтобы избежать атак с использованием SQL-инъекций
  • медленно: вы делаете много звонков по БД;рассмотрим сначала описанный подход
  • хрупкий: вы можете добавить проверку, чтобы увидеть, удалось ли обновить

См. http://php.net/manual/function.explode.php и документы по mysql-запросу там также длябольше информации

1 голос
/ 18 марта 2011

Как вы упомянули выше, что поля разделены вкладкой, вы можете импортировать файл непосредственно в MySQL (при условии, что id является первичным ключом этой таблицы):

LOAD DATA INFILE 'data.txt' REPLACE INTO TABLE mytable (id,name);

(Примечание: это будетне только обновлять, но и добавлять записи)

0 голосов
/ 17 марта 2011

Вы можете использовать explode(), чтобы разбить вашу строку на строки; и затем для каждой строки простое регулярное выражение с функцией preg_match() для соответствия интересующим вас частям.

Например, что-то вроде этого:

$str = <<<STR
22222   hihihi
33333   hihihi
kjhkh   hihihi
STR;

foreach (explode(PHP_EOL, $str) as $line) {
  if (preg_match('/^([^\s]+)\s+(.*)$/', $line, $m)) {
    var_dump($m[1], $m[2]);
  }
}

Получил бы вас:

string '22222' (length=5)
string 'hihihi' (length=6)
string '33333' (length=5)
string 'hihihi' (length=6)
string 'kjhkh' (length=5)
string 'hihihi' (length=6)


Заметки о регулярном выражении, которое я использовал:

  • начинается с начала строки: ^
  • соответствует всему, что не является белым символом (табуляция, новая строка, пробел): [^\s]
    • один или несколько раз: [^\s]+
    • захватывая его: ([^\s]+)
  • соответствует всему, что является белым символом: \s
    • один или несколько раз: \s+
  • соответствует чему угодно любое количество раз: .*
    • захватывая его: (.*)
  • и, наконец, конец строки: $


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

0 голосов
/ 17 марта 2011

Если вы уверены, что это всегда 5 символов, вы можете просто использовать:

<?php
$ID = substr($varToEachLine, 0, 5);
?>
0 голосов
/ 17 марта 2011

Это текстовый файл с разделителями.Вы можете использовать текстовый драйвер для загрузки данных в набор записей очень легко.Я не в PHP, но я считаю, что текстовые драйверы есть для PHP.Если ваше приложение работает в Windows, Microsoft Jet поддерживает текстовый драйвер, который можно использовать для переноса данных в набор записей.

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