Търся помощ за създаване на подобна функционалност за импортиране и картографиране на CSV, подобно на Mailchimp

Това, което се опитвам да направя, е да кача CSV с продукти и да получа заглавките и да създам инструмент за картографиране, който ще позволи на потребителя да съпостави CSV заглавките с полетата, в които трябва да бъдат импортирани. Мисля, че трябва да взема стойностите на колоните, за разлика от стойностите на редовете.

В момента Mailchimp има тази много страхотна функционалност, както съм сигурен, че го правят и всички други големи играчи в имейл маркетинга. Веднъж импортирана, системата изброява всяко име на колона и позволява на потребителя да избере към какво да я съпостави с техните вградени колони.

Проучих няколко различни вече съществуващи решения, които всички изглеждаха бъгови, и просто ще трябва да създам мое собствено персонализирано решение.

В момента използвам PHP/MySQL. Всяка помощ или съвет ще бъдат много оценени!


person AllSystemsDown    schedule 23.05.2014    source източник
comment
Можете ли да дадете кратък пример за това как изглежда CSV? Само за пояснение, опитвате ли се да вземете CSV и да картографирате (вмъкнете) всички негови данни в MySQL таблица, където потребителят изрично е дефинирал съответстващите CSV заглавки и колони на базата данни?   -  person Shane Reeves    schedule 23.05.2014
comment
Здравей Шейн, благодаря за отговора. CSV е доста стандартен, за около 12 заглавки на колони и различни типове данни за всяка клетка. За да отговоря на въпроса ви, бих искал междинна стъпка, след като потребителят качи CSV, където може да избере към коя таблица отива всяка колона с данни от CSV. След това го изпраща за вмъкване в базата данни. Надявам се, че това отговаря изчерпателно на въпроса ви. Опитах се да прикача екранна снимка от Mailchimp, но в момента нямам достатъчно точки за репутация! Благодаря ти!   -  person AllSystemsDown    schedule 23.05.2014
comment
Съжалявам за бавния отговор, ще се опитам да снимам нещо заедно тази вечер, за да спечелите. Прибирам се от работа. :)   -  person Shane Reeves    schedule 24.05.2014


Отговори (1)


Въз основа на това, което ми предоставихте, събрах следния PHP клас, който, надявам се, трябва да ви предостави функционалността, от която се нуждаете. Долната част на кода демонстрира използването на малкия клас.

<?php
class CSVtoSQL {
    private $filePath, $csvData;

    public function __construct($filePath) {
        $this->filePath = $filePath;
    }

    public function readDataIn() {
        $file = fopen($this->filePath, 'r');
        $data = fread($file, filesize($this->filePath));

        // Split CSV line by line.
        $lines = explode("\n", $data);

        // Split each line by commas to extract each value.
        for ($i = 0; $i < sizeof($lines); $i++) {
            $this->csvData[$i] = explode(',', $lines[$i]);
        }

        fclose($file);

        // Returns true if we managed to read data, false if we didn't.
        return (sizeof($this->csvData) > 0);
    }

    public function getHeadings() {
        if (sizeof($this->csvData) > 0) {
            // The first index of csvData has all the headings.
            return $this->csvData[0];
        }
        else {
            return null;
        }
    }

    public function pushToDatabase($con, $tableName, $columns) {
        $createColumnQuery = '';
        $insertQuery = 'INSERT INTO ' . $tableName . ' (';

        // Build column section of query.
        foreach ($columns as $column) {
            $createColumnQuery .= $column['name'] . ' ' . $column['type'] . ',';
        }

        // Remove trailing comma.
        $createColumnQuery = rtrim($createColumnQuery, ',');

        // Create table.
        $con->query('CREATE TABLE ' . $tableName . ' (' . $createColumnQuery . ')');

        // Create insert query template.
        foreach ($columns as $column) {
            $insertQuery .= $column['name'] . ',';
        }

        // Remove trailing comma.
        $insertQuery = rtrim($insertQuery, ',');

        // Insert values using our insertQuery string which looks like: "INSERT INTO <<table name>> (<<column 1>>, <<column 2>>"
        // Also skip the first line as that has the headings.
        for ($i = 1; $i < sizeof($this->csvData); $i++) {
            $values = '';

            foreach($this->csvData[$i] as $value) {
                $values .= '\'' . $value . '\',';
            }

            // Remove trailing comma.
            $values = rtrim($values, ',');
            $con->query($insertQuery . ') VALUES (' . $values . ')');
        }
    }
}

$csv = new CSVtoSQL('test.csv');
$csv->readDataIn();
var_dump($csv->getHeadings());
$con = new mysqli('127.0.0.1', 'root', '', 'testdb');
$columns = array(array('name'=>'col1', 'type'=>'VARCHAR(256)'),
                array('name'=>'col2', 'type'=>'VARCHAR(256)'),
                array('name'=>'col3', 'type'=>'VARCHAR(256)'));
$csv->pushToDatabase($con, 'test_table', $columns);
?>

Когато създавате нов обект от класа CSVtoSQL, преминете през пътя към CSV файла (това може да бъде относително или абсолютно). След това извикайте процедурата readDataIn(), за да отворите CSV, да извадите редовете и да ги съхраните в обекта. След това можете по избор да извлечете масив от заглавия, намерени в CSV, като извикате getHeadings(). Това ще бъде полезно за вас, когато искате да подканите потребителя към кои колони на базата данни желае да съпостави всяко CSV заглавие. И накрая, извикайте pushToDatabase() и осигурете MySQLi обект за свързване, име на таблица и данни за колона, както е показано.

За мен е тривиално да напиша формуляра за качване вместо вас, но този клас трябва да ви помогне да решите проблема си.

Късмет!

person Shane Reeves    schedule 24.05.2014
comment
Шейн, благодаря ти! Оценявам усилията ви да направите това да работи. Сега се опитвам да използвам това. - person AllSystemsDown; 28.05.2014
comment
Без притеснения, не би трябвало да е твърде трудно за прилагане с някои прости HTML форми. Късмет! - person Shane Reeves; 29.05.2014