Проверить тип разделителя в CSV-файл


Да сценария импорта CSV PHP но у меня возникают трудности с проверкой типа форматирования CSV. Мне нужно проверить, если он отделен ,, ; \t и : |, но я не получаю.

соответствует Сценария:

<?php

    $arquivo = isset($_FILES["file_csv"]) ? $_FILES["file_csv"] : FALSE;

    $tipoValido = "text/comma-separated-values";

    if($tipoValido != $arquivo["type"])
    {
        echo "Arquivo em formato inválido! O arquivo deve ser extensão CSV. Envie outro arquivo";
        echo '<br/><a href="index.html">Fazer Upload de Outro Arquivos</a>';
    }
    else
    {
        preg_match("/\.(csv){1}$/i", $arquivo["name"], $ext);

        $arquivo_nome = date("d-m-Y_H-i-s") . "." . $ext[1];

        move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);

        $row = 0;
        $handle = fopen ($arquivo_nome,"r");
        echo "<table border=1>";
        while ( $data = fgetcsv ($handle, 1000, ",") )
        {
            $num = count ($data);
            $row++;


            $coluna1 = $data[0];
            $coluna2 = $data[1];
            $coluna3 = $data[2];
            $coluna4 = $data[3];
            $coluna5 = $data[4];

            //$query = "INSERT INTO tabela ( coluna1 , coluna2 , coluna3 ) VALUES ( '$coluna1' , '$coluna2' , '$coluna3', '$coluna4', '$coluna5' )";
            //mysql_query($query) or die(mysql_error());

            if ($row != 1)
            {

                echo "<tr>";
                echo "<td>".$coluna1."</td>";
                echo "<td>".$coluna2."</td>";
                echo "<td>".$coluna3."</td>";
                echo "<td>".$coluna4."</td>";
                echo "<td>".$coluna5."</td>";
                echo "</tr>";
            }
        }

        echo "</table>";

        echo "<p>Dados da planilha inseridos com sucesso!<br/>Total de linhas inseridas: ".$row."</p>";

        fclose ($handle);

        unlink($arquivo_nome);
    }

?>
Author: Guilherme Nascimento, 2015-06-16

2 answers

, Получил решение, и я пойду здесь, если кому-то нужно.

Создал функция чтобы проверить, разделитель файла, следует сценарий в комплекте с dvd CSV:

<?php

function getArquivoDelimitador($arquivo_recebido, $verificar_linhas = 2)
{
    $arquivo_recebido = new SplFileObject($arquivo_recebido);

    $delimitadores = array(',', "\t", ';', '|', ':');

    $resultado = array();

    for($i = 0; $i < $verificar_linhas; $i++){
        $linha = $arquivo_recebido->fgets();
        foreach ( $delimitadores as $delimitador )
        {
            $regExp = '/['.$delimitador.']/';

            $fields = preg_split( $regExp, $linha );

            if( count( $fields ) > 1 )
            {
                if( !empty( $resultado[$delimitador] ) )
                {
                    $resultado[$delimitador]++;
                } else {
                    $resultado[$delimitador] = 1;
                }
            }
        }
    }

    $resultado = array_keys( $resultado, max( $resultado ) );

    return $resultado[0];
}

$arquivo = isset($_FILES["file_csv"]) ? $_FILES["file_csv"] : FALSE;

$delimitador = getArquivoDelimitador($arquivo['tmp_name']);

$tipoValido = "text/comma-separated-values";

if($tipoValido != $arquivo["type"])
{
    echo "Arquivo em formato inválido! O arquivo deve ser extensão CSV. Envie outro arquivo";
    echo '<br/><a href="index.html">Fazer Upload de Outro Arquivos</a>';
}
else
{
    preg_match("/\.(csv){1}$/i", $arquivo["name"], $ext);

    $arquivo_nome = date("d-m-Y_H-i-s") . "." . $ext[1];

    move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);

    $row = 0;
    $handle = fopen ($arquivo_nome,"r");
    echo "<table border=1>";

    while ( $data = fgetcsv ($handle, 1000, $delimitador) )
    {
        $num = count ($data);
        $row++;


        $coluna1 = $data[0];
        $coluna2 = $data[1];
        $coluna3 = $data[2];
        $coluna4 = $data[3];
        $coluna5 = $data[4];

        //$query = "INSERT INTO tabela ( coluna1 , coluna2 , coluna3 ) VALUES ( '$coluna1' , '$coluna2' , '$coluna3', '$coluna4', '$coluna5' )";
        //mysql_query($query) or die(mysql_error());

        if ($row != 1)
        {

            echo "<tr>";
            echo "<td>".$coluna1."</td>";
            echo "<td>".$coluna2."</td>";
            echo "<td>".$coluna3."</td>";
            echo "<td>".$coluna4."</td>";
            echo "<td>".$coluna5."</td>";
            echo "</tr>";
        }
    }

    echo "</table>";

    echo "<p>Dados da planilha inseridos com sucesso!<br/>Total de linhas inseridas: ".$row."</p>";

    fclose ($handle);

        unlink($arquivo_nome);
    }

?>
 3
Author: MoisesGama, 2015-06-16 20:08:42

В моем проекте Java, uniVocity-parsers, я создал алгоритм, способный определить:

  • Separator значение (,)

  • Разделитель строк

  • Кавычки (двойные или одинарные)

  • Escape-кавычки (как правило \" или "")

Вот алгоритм (предупреждение: eh комплекс). Процесс не да просто, потому что вы должны игнорировать то, что находится в кавычках, значения separator линии, коммуникации.

" Не должно быть слишком сложно воссоздать этот код в PHP.

 0
Author: Jeronimo Backes, 2015-06-18 12:18:08