Как проанализировать CSV-файл в MySQL DB с PHP с условиями - PullRequest
1 голос
/ 27 июня 2011

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

например, у меня в настоящее время есть CSV-файл, который выглядит следующим образом

0001D,5879
0001E,0521
0001F,4587
0001G,2220
0001H,2482
0001I,9087
0001J,2255
0001K,2247

коды перед запятой должны быть только шестнадцатеричными значениями, что я хотел бы сделать, это исключить любую строку (таким образом, шестнадцатеричное значение и его код), которые не представляют шестнадцатеричный код (0-9) - (AF) ... любая идея о том, как это может быть выполнено?

Ответы [ 2 ]

0 голосов
/ 27 июня 2011

Вам гораздо лучше делать это без PHP, если это возможно. Используйте mysqlimport для импорта файла, а затем используйте:

-- assuming you use "ID" as your first column like the example 
-- on the mysqlimport page
DELETE FROM <tablename> WHERE CONV(CONV(ID, 16, 10), 10, 16) != 
                              TRIM(LEADING '0' FROM ID);

Итак, что происходит?

  1. Сначала вы импортировали все в таблицу.
  2. Затем вы просмотрели все столбцы, которые должны быть шестнадцатеричными. Если они не могут быть преобразованы в шестнадцатеричное и обратно (то, что верно только для действительных шестнадцатеричных чисел, все остальное усекается) и соответствуют урезанной версии самих себя (необходимо учитывать ведущие 0), они недопустимы.

Если вы должны использовать PHP, я бы лично просто постоянно использовал INSERT в MySQL, и я все равно вызывал бы вышеприведенное DELETE. Держу пари, что это быстрее.

0 голосов
/ 27 июня 2011

Этот код использует функцию fgetcsv для анализа одной строки за раз из файла CSV, помещения каждого разделенного поля в массив и возврата этого массива.В вашем примере csv возвращаемый массив будет содержать только два поля.

Далее, после проверки, чтобы убедиться, что возвращаемое значение из fgetcsv не false или null, код проверяется напосмотрите, содержит ли первое поле массива любые не шестнадцатеричные символы в диапазоне [GZ], используя preg_match.Если этого не произойдет, то он поместит два поля массива (представляющих строку из вашего CSV-файла) в новый массив, с которым вы сможете работать позже.

<?php
$fileName = "test.csv";
$hexLines = array();

if (($file = fopen($fileName, "r")) !== false)
{
    while (($line = fgetcsv($file, 0, ",")) !== false)
    {
        if (!empty($line))
        {
            // IF first field only has hex chars
            if (preg_match('/^[0-9A-F]+$/', $line[0]) === 1) 
            {
                $hexLines[] = array($line[0], $line[1]);
            }
        }
    }
    fclose($file);
}
print_r($hexLines);

Кстати,приведенный выше код будет работать в обеих версиях PHP 5.2.x и 5.3.x.Если бы вы были на 100% уверены, что собираетесь использовать 5.3, я бы написал код, используя вместо этого SplFileObject, поскольку он объектно-ориентирован и, возможно, немного проще в использовании, чем указанные выше функции..

...