2016-05-30 10 views
2

異なる構造を持つ多くの異なるファイルをdbにマップする必要があります。これらのxlsxにはさまざまなテーブルがありますので、スキルレスnoSQLのアプローチについて考えましたが、私はこの分野ではかなり初心者です。異なるExcelファイルをdbにマップするソリューション

xlsxファイルを解析するためのテーブル/セルを選択するためのクライアントインターフェイスを備えたマイクロサービスである必要があります。私は厳格な技術を持っていません。それは、JAVA、GROOVY、Python、またはJavaScriptエンジンであってもよい。

これを実行するための解決策はありますか?ここで

は、例えばXLSXである(しかし、私はまた、XLS形式で、また、他のファイルを持っている): http://stat.gov.pl/download/gfx/portalinformacyjny/pl/defaultaktualnosci/5502/11/13/1/wyniki_finansowe_podmiotow_gospodarczych_1-6m_2015.xlsx

答えて

1

をあなたのファイルをロードしますデータをJSONに解析するためのカスタムアドオンを作成するためのExcelとGoogle Apps Script(https://developers.google.com/apps-script/overview)の表示 スプレッドシートサービス(https://developers.google.com/apps-script/reference/spreadsheet/)には、シート内のデータにアクセスする方法が豊富に用意されています。

次にJSON over API(https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)を送信するか、データベース(https://developers.google.com/apps-script/guides/jdbc)に直接入力してください。

おそらくクリーンではありませんが、速い解決策です。

+0

このようなソリューションを実際に試作しましたか? Googleのapiスプレッドシートを使用することには何らかの制限がありますか? –

+0

はい、Google Apps Script(スプレッドシート、ドキュメント)を使用し、REST APIを介してスクリプトからFlask(Pythonフレームワーク)に接続します。クォータはアカウントタイプ、つまりURLフェッチコール(APIの場合) - 1日あたり20,000(通常のGmailアカウントの場合)によって異なります。 https://developers.google.com/apps-script/guides/services/quotas#current_quotasを確認します。 –

1

は、私はあなたの問題とほぼ同じの仕事をしてプロジェクトを持っていたが、私が持っていたとして、それが簡単に思えますxlsxファイルの固定構造。

xlsx解析では、私はPythonとOpenpyxlを使って実験していましたが、それらを扱う際に苦労することはなく、シンプルで、高速で使いやすいです。

データベースの場合は、MongoDBを使用することをお勧めします.MongoDBのドキュメントやコレクションは、JSONオブジェクトやJSONオブジェクトのセットと同じように簡単に処理できます。 PyMongoはPythonからMongoDBを使って作業するのに最適で推奨される方法です。

問題は、構造が異なるファイルが違うことです。私はあなたのデータを見ることなくこれ以上深く推薦することはできません。しかし、あなたはそれらの一般的な構造を見つけ出すか、それらを共通セットに分類する方法を理解しなければならず、各セットは適切なアルゴリズムを使用して解析されます。

+0

お返事ありがとうございます。いくつかの異なるタブで、解析するファイルの1つを追加しました。 –

0

Javascriptのソリューション、(あなたはどこにも輸出を作ることができる)xlsx2csvとして:あなたがしなければならない作業がETL (Extract Transform Load)呼ばれ

var def = "1.xlsx"; 
if (WScript.Arguments.length>0) def = WScript.Arguments(0); 

var col = []; 


var objShell = new ActiveXObject("Shell.Application"); 
var fs = new ActiveXObject("Scripting.FileSystemObject"); 



function flush(){ 
    WScript.Echo(col.join(';')); 
    } 



function import_xlsx(file) { 
var strZipFile = file; // '"1.xlsx"  'name of zip file 
var outFolder = "."; //   'destination folder of unzipped files (must exist) 
var pwd =WScript.ScriptFullName.replace(WScript.ScriptName, ""); 
var i,j,k; 
var strXlsFile = strZipFile; 
var strZipFile = strXlsFile.replace(".xlsx",".zip").replace(".XLSX",".zip"); 
fs.CopyFile (strXlsFile,strZipFile, true); 
var objSource = objShell.NameSpace(pwd+strZipFile).Items(); 
var objTarget = objShell.NameSpace(pwd+outFolder); 
for (i=0;i<objSource.Count;i++) 
    if (objSource.item(i).Name == "xl"){ 
     if (fs.FolderExists("xl")) fs.DeleteFolder("xl"); 
     objTarget.CopyHere(objSource.item(i), 256); 
     } 

var xml = new ActiveXObject("Msxml2.DOMDocument.6.0"); 
xml.load("xl\\sharedStrings.xml"); 
var sel = xml.selectNodes("/*/*/*") ; 
var vol = []; 
for(i=0;i<sel.length;i++) vol.push(sel[i].text); 
xml.load ("xl\\worksheets\\sheet1.xml"); 
ret = ""; 
var line = xml.selectNodes("/*/*/*"); 
var li, line2 = 0, line3=0, row; 

for (li = 0; li< line.length; li++){ 
    if (line[li].nodeName == "row") 
    for (row=0;row<line[li].childNodes.length;row++){ 
     r = line[li].childNodes[row].selectSingleNode("@r").text; 
     line2 = eval(r.replace(r.substring(0,1),"")); 
     if (line2 != line3) { 
      line3 = line2; 
      if (line3 != 0) { 
       //flush -------------------------- line3 
       flush(); 
       for (i=0;i<col.length;i++) col[i]=""; 
      } 
     } 
     try{ 
     t = line[li].childNodes[row].selectSingleNode("@t").text; 
     //i = instr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", left(r,1)) 
     i = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(r.charAt(0)); 
     while (i > col.length) col.push("");   
     if (t == "s"){ 
      t = eval(line[li].childNodes[row].firstChild.text) 
      col[i] = vol[t]; 
     } else col[i] = line[li].childNodes[row].firstChild.text; 
     } catch(e) {}; 


} 
flush(); 
} 

if (fs.FolderExists("xl")) fs.DeleteFolder("xl"); 
if (fs.FileExists(strZipFile)) fs.DeleteFile(strZipFile); 
} 


import_xlsx(def); 
+0

あなたのソリューションはすべてのデータをcsvにエクスポートしていませんか?私はこのデータの一部だけをエクスポートしたいと思っています(私にとって重要で、他のもの、例えばコメントは無視してください)、データベースにはおそらくnoSQLに格納します。 –

2

。あなたは良いETLソフトウェア(here is a discussion about open source ETL)を見つけるか、あなたが使っている言語で独自のソリューションをスクリプト化する必要があります。

準備が整ったGUIソフトウェアの利点は、データをドラッグ&ドロップすればよいことですが、xlsxの例のようなカスタムロジックやセミストラクチャードデータがある場合は、サポートが限られています。

独自のスクリプトを書く利点は、必要な自由をすべて揃えていることです。

私はいくつかのETLの作業を行いました。カスタム論理を使用して独自のソリューションを作成するためにGroovyを使用しましたが、GUIの面ではエキゾチックなファイルタイプをインポートする必要がありました。

独自のソリューションを書くことを決めた場合、あなたがする必要がある:

  1. をロードしやすい形式にすべてのデータを変換します。あなたのケースでは、各xlsまたはxlsxタブを命名規則でCSVに変換する必要があります。
  2. たぶんGoogleスプレッドシートを試してみてくださいデータベース(SQLまたはNOSQL)で保存
  3. 望ましい形式でデータを置くために、あなたのロジックを実行してください
  4. を変換するために選択した言語で
関連する問題