2016-05-22 108 views
0

我有數千dB文件需要轉換爲CSV文件。這可以通過一個簡單的腳本/批處理文件即將多個數據庫轉換爲CSV

.open "Test.db" 
.mode csv 
.headers on. 

我需要的腳本來打開其他數據庫文件,所有具有不同的名稱來實現,有沒有,這可以被執行,因爲我不希望的方式上面寫劇本,每個數據庫文件

+0

你正在使用哪個操作系統? –

+0

Windows(Windows 2008 R2) – John

+0

表名是否相同? –

回答

1

sqlite3命令行外殼允許一些設置,使用命令行參數來完成的,所以你可以簡單地在每個數據庫文件執行一個簡單的SELECT *爲表:

for %%a in (*.db) do sqlite3 -csv -header "%%a" "select * from TableName" > %%~na.csv 

(當這不是批處理文件的一部分,但直接從命令行運行時,必須用%替換%%。)

+0

感謝您的解決方案,它的工作完美。我可以在30分鐘內將30,000個數據庫文件轉換爲CSV文件。 – John

2

我製作了一個腳本,它將當前目錄中的所有db-sqlite文件批量轉換爲CSV ,名爲「sqlite2csv」。那麼它會將每個db-sqlite的每個表格輸出爲一個CSV文件,因此如果您有10個文件和3個表格,則您將獲得30個CSV文件。希望它至少能夠幫助您製作自己的腳本。

#!/bin/bash 

# USAGE EXAMPLES : 
# sqlite2csv 
# - Will loop all sqlite files in the current directory, take the tables of 
# each of these sqlite files, and generate a CSV file per table. 
# E.g. If there are 10 sqlite files with 3 tables each, it will generate 
#  30 CSV output files, each containing the data of one table. 
# The naming of the generated CSV files take from the original sqlite 
# file name, prepended with the name of the table. 

# check for dependencies 
if ! type "sqlite3" > /dev/null; then 
    echo "[ERROR] SQLite binary not found." 
    exit 1 
fi 

# define list of string tokens that an SQLite file type should contain 
# the footprint for SQLite 3 is "SQLite 3.x database" 
declare -a list_sqlite_tok 
list_sqlite_tok+=("SQLite") 
#list_sqlite_tok+=("3.x") 
list_sqlite_tok+=("database") 

# get a lis tof only files in current path 
list_files=($(find . -maxdepth 1 -type f)) 

# loop the list of files 
for f in ${!list_files[@]}; do 
    # get current file 
    curr_fname=${list_files[$f]} 
    # get file type result 
    curr_ftype=$(file -e apptype -e ascii -e encoding -e tokens -e cdf -e compress -e elf -e tar $curr_fname) 
    # loop through necessary token and if one is not found then skip this file 
    curr_isqlite=0 
    for t in ${!list_sqlite_tok[@]}; do 
     curr_tok=${list_sqlite_tok[$t]} 
     # check if 'curr_ftype' contains 'curr_tok' 
     if [[ $curr_ftype =~ $curr_tok ]]; then 
      curr_isqlite=1 
     else 
      curr_isqlite=0 
      break 
     fi 
    done 
    # test if curr file was sqlite 
    if ((! $curr_isqlite)); then 
     # if not, do not continue executung rest of script 
     continue 
    fi 
    # print sqlite filename 
    echo "[INFO] Found SQLite file $curr_fname, exporting tables..." 
    # get tables of sqlite file in one line 
    curr_tables=$(sqlite3 $curr_fname ".tables") 
    # split tables line into an array 
    IFS=$' ' list_tables=($curr_tables) 
    # loop array to export each table 
    for t in ${!list_tables[@]}; do 
     curr_table=${list_tables[$t]} 
     # strip unsafe characters as well as newline 
     curr_table=$(tr '\n' ' ' <<< $curr_table) 
     curr_table=$(sed -e 's/[^A-Za-z0-9._-]//g' <<< $curr_table) 
     # temporarily strip './' from filename 
     curr_fname=${curr_fname//.\//} 
     # build target CSV filename 
     printf -v curr_csvfname "%s_%s.csv" $curr_table "$curr_fname" 
     # put back './' to filenames 
     curr_fname="./"$curr_fname 
     curr_csvfname="./"$curr_csvfname 
     # export current table to target CSV file 
     sqlite3 -header -csv $curr_fname "select * from $curr_table;" > $curr_csvfname 
     # log 
     echo "[INFO] Exported table $curr_table in file $curr_csvfname" 
    done 
done