CSV форматирование файла

1

У меня проблема: мне нужно импортировать CSV файл в базу данных MS Access с помощью PHP. У меня есть сценарий, который может это сделать, но формат файла CSV неправильный.

Исходный формат: Изображение 174551

Но скрипт работает с этим форматом: Изображение 174551

Оба файла - CSV. Как преобразовать первый формат файла в нужный?

Мой сценарий импорта ниже не импортирует ничего и не дает никаких ошибок:

if (isset($_POST['submit'])) {
            $i=0;
            require "connection.php";
            if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
                echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
            }
            //Import uploaded file to Database
            $handle = fopen($_FILES['csv']['tmp_name'], "r");
            $import=$db->prepare("INSERT INTO adherence(
                    dateandtime,
                    lastname,
                    firstname,
                    paidtime,
                    approvedtime,
                    notadhering)VALUES(
                    ?,?,?,?,?,?)");
            while (($data = fgetcsv($handle, 1000,"\t","'")) !== FALSE) {
                if($i>0) {
                $data = str_replace('"', '', $data);
                $myDate =  date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
                $import->bindParam(1, $myDate, PDO::PARAM_STR);
                $import->bindParam(2, $data[1], PDO::PARAM_STR);
                $import->bindParam(3, $data[2], PDO::PARAM_STR);
                $import->bindParam(4, $data[3], PDO::PARAM_STR);
                $import->bindParam(5, $data[4], PDO::PARAM_STR);
                $import->bindParam(6, $data[5], PDO::PARAM_STR);
                str_replace('"',' ',$data);
                $import->execute();
                }
                $i++;

            }

EDIT Текущий код:

<?php
        if (isset($_POST['submit'])) {
            $i=0;
            require "connection.php";
            if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
                echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
            }
            //Import uploaded file to Database
            $handle = fopen($_FILES['csv']['tmp_name'], "r");
            $import=$db->prepare("INSERT INTO adherence(
                    dateandtime,
                    lastname,
                    firstname,
                    paidtime,
                    approvedtime,
                    notadhering)VALUES(
                    ?,?,?,?,?,?)");
            $badlines=[];
while (($data = fgetcsv($handle, 1000,"\t",'"')) !== FALSE) {
    if($i>0) {
        //skip but keep track of bad data
        if(count($data) !== 5){
            $badlines[] = $i;
            continue;
        }
        $myDate =  date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
        $names = explode(',', $data[1]);
        $import->bindParam(1, $myDate, PDO::PARAM_STR);
        $import->bindParam(2, $names[0], PDO::PARAM_STR);
        $import->bindParam(3, $names[1], PDO::PARAM_STR);
        $import->bindParam(4, $data[2], PDO::PARAM_STR);
        $import->bindParam(5, $data[3], PDO::PARAM_STR);
        $import->bindParam(6, $data[4], PDO::PARAM_STR);
        $import->execute();
    }
    $i++;

}
            $removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
            $removal->execute();

            fclose($handle);
        }
  • 4
    Первый из них является разделителем табуляции. Если вы используете fgetcsv() тогда просто измените третий параметр на "\t" .
  • 0
    замена запятых на табуляцию (\ t) может помочь
Показать ещё 10 комментариев
Теги:
csv
export-to-csv
ms-access

1 ответ

0
Лучший ответ

"name, lastname" - это один столбец, поскольку он окружен двойными кавычками. Ваш код изначально работал, поскольку вы неправильно сконфигурировали fgetscsv, передав одиночную цитату в качестве параметра оболочки, заставив ее игнорировать эти двойные кавычки и рассматривать один столбец как два, поскольку он содержит запятую.

Поскольку ваш новый файл имеет вкладку, он не делится на запятую.

Чтобы исправить, передайте правильный параметр оболочки в fgetcsv и разделите столбец самостоятельно:

$badlines=[];
while (($data = fgetcsv($handle, 1000,"\t",'"')) !== FALSE) {
    if($i>0) {
        //skip but keep track of bad data
        if(count($data) !== 5){
            $badlines[] = $i;
            continue;
        }
        $myDate =  date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
        $names = explode(',', $data[1]);
        $import->bindParam(1, $myDate, PDO::PARAM_STR);
        $import->bindParam(2, $names[0], PDO::PARAM_STR);
        $import->bindParam(3, $names[1], PDO::PARAM_STR);
        $import->bindParam(4, $data[2], PDO::PARAM_STR);
        $import->bindParam(5, $data[3], PDO::PARAM_STR);
        $import->bindParam(6, $data[4], PDO::PARAM_STR);
        $import->execute();
    }
    $i++;

}
  • 0
    Ошибка: Примечание: неопределенное смещение: 1 строка: $ names = explode (',', $ data [1]);
  • 0
    @JustinasT Тогда, в конце концов, это не вкладки - сложно сказать со скриншотом. Хотя вы бы имели ту же ошибку с существующим кодом
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню