将不同的excel文件映射到db的解决scheme

我必须将许多具有不同结构的不同文件映射到数据库。 在这些xlsx中有很多不同的表,所以我想到了无法使用的noSQL方法,但是我在这个领域是相当新手的。

它应该是一个客户端界面的微服务,用于select表/单元格来parsingxlsx文件。 我没有严格的技术, 它可能是JAVA,GROOVY,Python甚至JavaScript引擎。

你知道任何工作的解决scheme吗?

这里是xlsx示例(但我也有其他文件,也是xls格式): http : //stat.gov.pl/download/gfx/portalinformacyjny/pl/defaultaktualnosci/5502/11/13/1/wyniki_finansowe_podmiotow_gospodarczych_1- 6m_2015.xlsx

也许你应该尝试使用Google表格来显示excel和Google Apps脚本( https://developers.google.com/apps-script/overview )来编写用于parsing数据到JSON的自定义附件。 电子表格服务( https://developers.google.com/apps-script/reference/spreadsheet/ )有很多方法可以访问表单中的数据。

接下来,您可以通过API( https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app )发送此JSON或直接将其放入数据库( https://developers.google.com / apps-script / guides / jdbc )。

也许是不干净,但快速的解决scheme。

您所要做的工作称为ETL(Extract Transform Load) 。 您需要find一个好的ETL软件( 这里是关于开源ETL的讨论 ),或者用您使用的语言编写您自己的解决scheme。

现成的graphics用户界面软件的优点是,你只需要拖放数据,但是如果你有一些自定义的逻辑或半结构化的数据,就像你的xlsx例子那样,你的支持有限。

编写自己的脚本的好处是你有你需要的所有自由。

我已经完成了一些ETL工作,并成功地使用了Groovy来编写自定义逻辑的解决scheme等等。而在GUI方面,当我不得不导入一些奇特的文件types时,我使用了Altova Mapforce。

如果你决定写你自己的解决scheme,你必须:

  1. 将所有数据转换为易于加载的格式。 在你的情况下,你必须将每个xls或xlsx选项卡转换为CSV命名约定。
  2. 以您select的语言加载文件进行转换
  3. 做你的逻辑把数据放在一个理想的格式
  4. 将其保存在数据库中(SQL或noSQL)

我有一个项目完成工作几乎相同的问题,但似乎更容易,因为我有一个固定的xlsx文件结构。

对于xlsxparsing,我用Python和Openpyxl进行了实验,在处理它们时没有挣扎,它们简单,快速且易于使用。

对于数据库,我build议使用MongoDB,你可以在MongoDB中处理文档和集合,就像使用JSON对象或一组JSON对象一样简单。 PyMongo是我认为用Python处理MongoDB的最好和推荐的方法。

问题是你有不同的结构不同的文件。 如果没有查看您的数据,我不能推荐更深入的内容。 但是你应该find它们的一般结构,或者你必须找出将它们分类为常见集合的方法,每个集合将使用适当的algorithm进行分析。

Javascript的解决scheme,因为xlsx2csv(你可以导出到任何地方):

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);