source

CSV Storage 엔진을 사용하여 CSV 파일에서 직접 mysql 테이블을 생성하시겠습니까?

gigabyte 2022. 9. 27. 23:23
반응형

CSV Storage 엔진을 사용하여 CSV 파일에서 직접 mysql 테이블을 생성하시겠습니까?

MySQL에는 기본 CSV 스토리지 엔진이 있어 테이블당 쉼표로 구분된 값 파일에 데이터를 저장한다는 사실을 방금 알게 되었습니다.

업로드된 CSV 파일에서 다음과 같은 테이블을 직접 작성할 수 있습니까?

CREATE TABLE USERS < PATH/USERS.CSV

어디에users.csv사용자가 업로드 했습니까?

방금 CSV 파일용 Unix 명령줄 도구 세트인 csvkit을 발견했습니다.Mac에 설치했습니다.pip install csvkit명령어는 다음과 같습니다.

csvsql --dialect mysql --snifflimit 100000 bigdatafile.csv > maketable.sql

또는 DB 연결 문자열을 제공하여 테이블을 직접 로드할 수 있습니다.

이건 불가능해.테이블을 작성하려면 테이블 스키마가 필요합니다.당신이 가지고 있는 것은 데이터 파일입니다.스키마를 만들 수 없습니다.

파일에 헤더 행이 있는지 확인하고 이 경우 해당 헤더 행을 사용하여 테이블을 수동으로 작성할 수 있습니다.

그러나 MySQL 매뉴얼의 주석 섹션에서 John Swapceinski가 설명한 배치 파일을 사용하여 테이블 생성 문을 생성하는 방법이 있습니다.

John Swapceinski에 의해 2011년 9월 5일 오전 5시 33분에 게시되었습니다.
.csv 파일의 헤더를 사용하여 테이블을 만듭니다.

#!/bin/sh
# pass in the file name as an argument: ./mktable filename.csv
echo "create table $1 ( "
head -1 $1 | sed -e 's/,/ varchar(255),\n/g'
echo " varchar(255) );"

데이터 Import는 MySQL Workbench를 사용하는 것이 좋습니다.Workbench를 사용하면 CSV 또는 JSON 형식의 파일에서 새 테이블을 만들 수 있습니다.마법사를 통해 몇 번의 클릭만으로 테이블 스키마 및 데이터 가져오기를 처리할 수 있습니다.

MySQL Workbench에서 테이블리스트의 컨텍스트메뉴를 사용하여Table Data Import Wizard.

MySQL Workbench 이미지

자세한 내용은 MySQL Workbench 6.5.1 테이블 데이터 내보내기가져오기 마법사 설명서를 참조하십시오.MySQL Workbench를 다운로드하십시오.

"CSV를 SQL로 변환"이 도움이 되었습니다.CSV 파일을 추가하면 바로 사용할 수 있습니다.

MySQL 프런트 엔드로 phpMyAdmin을 사용하는 경우 보다 쉬운 방법이 있습니다.

  1. 기본 설정으로 데이터베이스를 만듭니다.
  2. 데이터베이스를 선택합니다.
  3. 화면 상단의 [Import](가져오기)를 클릭합니다.
  4. "Format" 아래에서 "CSV"를 선택합니다.
  5. CSV 파일에 적합한 옵션을 선택하고 텍스트 편집기에서 CSV 파일을 열어 참조하면 "적절한" 옵션을 얻을 수 있습니다.

문제가 있는 경우 데이터베이스를 삭제하고 다시 시도하십시오.

언급된 다른 솔루션과 더불어, Mac 사용자는 SQL Pro에 CSV 가져오기 옵션이 있어 상당히 잘 작동하고 유연하다는 점에 주목해야 합니다. Import 시 열 이름과 필드 유형을 변경할 수 있습니다.새 표를 선택하십시오. 그렇지 않으면 첫 번째 대화 내용이 다소 낙담할 수 있습니다.

Sequel Pro - MySQL 데이터베이스 작업을 위한 데이터베이스 관리 응용 프로그램입니다.

PHP 솔루션을 찾고 있는 경우는, 「PHP_MySQL_wrapper를 참조해 주세요.

$db = new MySQL_wrapper(MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DB);
$db->connect(); 

// this sample gets column names from first row of file
//$db->createTableFromCSV('test_files/countrylist.csv', 'csv_to_table_test');

// this sample generates column names 
$db->createTableFromCSV('test_files/countrylist1.csv', 'csv_to_table_test_no_column_names', ',', '"', '\\', 0, array(), 'generate', '\r\n');

/** Create table from CSV file and imports CSV data to Table with possibility to update rows while import.
 * @param   string      $file           - CSV File path
 * @param   string      $table          - Table name
 * @param   string      $delimiter      - COLUMNS TERMINATED BY (Default: ',')
 * @param   string      $enclosure      - OPTIONALLY ENCLOSED BY (Default: '"')
 * @param   string      $escape         - ESCAPED BY (Default: '\')
 * @param   integer     $ignore         - Number of ignored rows (Default: 1)
 * @param   array       $update         - If row fields needed to be updated eg date format or increment (SQL format only @FIELD is variable with content of that field in CSV row) $update = array('SOME_DATE' => 'STR_TO_DATE(@SOME_DATE, "%d/%m/%Y")', 'SOME_INCREMENT' => '@SOME_INCREMENT + 1')
 * @param   string      $getColumnsFrom - Get Columns Names from (file or generate) - this is important if there is update while inserting (Default: file)
 * @param   string      $newLine        - New line delimiter (Default: \n)
 * @return  number of inserted rows or false
 */
// function createTableFromCSV($file, $table, $delimiter = ',', $enclosure = '"', $escape = '\\', $ignore = 1, $update = array(), $getColumnsFrom = 'file', $newLine = '\r\n')

$db->close();

이 bash 스크립트를 사용할 수 있습니다.

변환하다

실행하다

./convert.sh -f example/mycsvfile.csv

shiplu.mokadd.im의 스크립트를 제 요구에 맞게 채택했습니다.관계자:

#!/bin/bash
if [ "$#" -lt 2 ]; then
    if [ "$#" -lt 1 ]; then 
        echo "usage: $0 [path to csv file] <table name> > [sql filename]"
        exit 1
    fi
    TABLENAME=$1
else
    TABLENAME=$2
fi
echo "CREATE TABLE $TABLENAME ( "
FIRSTLINE=$(head -1 $1)
# convert lowercase characters to uppercase
FIRSTLINE=$(echo $FIRSTLINE | tr '[:lower:]' '[:upper:]')
# remove spaces
FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/ /_/g')
# add tab char to the beginning of line
FIRSTLINE=$(echo "\t$FIRSTLINE")
# add tabs and newline characters
FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/,/,\\n\\t/g')
# add VARCHAR
FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/,/ VARCHAR(255),/g')
# print out result
echo -e $FIRSTLINE" VARCHAR(255));"

이것은 불가능하지만 기존 테이블 파일을 덮어쓸 수 있습니다.다만, 파일내의 행의 엔딩은, Windows 의 스타일(\r\n 로 끝남)이 아니고, Windows 로 끝남(\r\n 로 끝남)인 것을 확인해 주세요.

Python을 사용해도 괜찮으시다면 Panda가 잘 작동했습니다(csvsql은 영원히 교수형에 처했습니다).예를 들어 다음과 같습니다.

from sqlalchemy import create_engine
import pandas as pd

df = pd.read_csv('/PATH/TO/FILE.csv')
# Optional, set your indexes to get Primary Keys
df = df.set_index(['COL A', 'COL B'])

engine = create_engine('mysql://user:pass@host/db', echo=False)

df.to_sql(table_name, dwh_engine, index=False)

또, 질문의 일부였던 「CSV 엔진 사용」부분도 해결이 되지 않습니다만, 저도 도움이 될지도 모릅니다.

바로 이 기능을 하는 Windows 명령줄 도구를 만들었습니다.

여기서 다운로드할 수 있습니다. http://commandline.dk/csv2ddl.htm

사용방법:

C:\Temp>csv2ddl.exe mysql test.csv test.sql

또는

C:\Temp>csv2ddl.exe mysql advanced doublequote comma test.csv test.sql

MySQL for Excel 플러그인이 도움이 됩니다.

http://dev.mysql.com/doc/refman/5.6/en/mysql-for-excel.html

CSV 파일을 Excel로 엽니다.이 플러그인을 사용하여 Excel 데이터를 원격 또는 로컬 mysql 서버의 새 테이블로 내보낼 수 있습니다.데이터(상위 100~1000행)를 분석하여 대응하는 테이블 스키마를 만듭니다.

CSV 파일 목록을 MySQL 데이터베이스에 로드하는 스크립트입니다.여기에는 파일의 첫 번째 줄을 기반으로 한 테이블 작성도 포함됩니다.

#!/bin/bash

CREDENTIALS="--user=root --password=password --host=localhost --port=3306"
CSVOPTIONS="$CREDENTIALS --local --delete --lock-tables --fields-terminated-by=; --fields-optionally-enclosed-by=\" --lines-terminated-by=\n"
FOLDER='my/folder'

files=(
    foo.csv
    bar.csv
)

for i in "${files[@]}"
do
    # get table name from file name
    TABLE="$(basename -- $i)"
    TABLE="${TABLE%.*}"

    # create the table
    COMMAND="DROP TABLE IF EXISTS $TABLE; CREATE TABLE $TABLE ( $(head -1 $FOLDER/$i | sed -e 's/;/ varchar(255),\n/g') varchar(255) );"
    mysql $CREDENTIALS $DB -e "$COMMAND"

    # fill in data
    mysqlimport $CSVOPTIONS --ignore-lines=1 $DB "$FOLDER/$i"

done

언급URL : https://stackoverflow.com/questions/9998596/create-mysql-table-directly-from-csv-file-using-the-csv-storage-engine

반응형