Check tab type in a CSV file

3

I've set up a script to import CSV with PHP but I'm having difficulty checking the type of CSV formatting. I need to check if it is separated by , or ; or \t or : or | , but I can not.

Follow the Script :

<?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);
    }

?>
    
asked by anonymous 16.06.2015 / 19:04

2 answers

3

I've got a solution and I'll leave it here if anyone needs it.

I've created a function to check the file delimiter, follow the script 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);
    }

?>
    
16.06.2015 / 21:44
0

In my Java project, uniVocity-parsers , I've created an algorithm that can identify:

  • value separator (,)

  • line separator

  • quotes (double or single)

  • escaping quotes (usually \ "or" ")

See the algorithm (warning: eh complex). The process is not simple because you have to ignore what's in quotation marks, values with line separator, etc.

It should not be too difficult to recreate this code in PHP.

    
18.06.2015 / 14:18