2014-09-21 45 views
0

我有一個看起來像這樣一個文件:消除線與JavaScript和正則表達式的數組打破

QUERY:1 
DATABASE:geoquery 
NL:What are the capitals of the states that border the most populated states? 
SQL:something 

QUERY:2 
DATABASE:geoquery 
NL:What are the capitals of the states bordering New York? 
SQL:SELECT state.Capital FROM state JOIN borderinfo ON state.State_Name = borderinfo.State_Name   
WHERE borderinfo.Border = 'New York' 

QUERY:3 
DATABASE:geoquery 
NL:Show the state capitals and populations. 
SQL:SELECT state.Capital, state.Population FROM state 

etc... 

的人生成此文件拒絕把它給我一個可用的格式就好說了,XML或JSON 。所以我用REGEX解析它幾次以獲得我想要的結果。

剝去數據庫來填充選擇列表(正常工作):

$.get('inputQueryExamples.txt', 
     function(data){ 
      var string = data; 
      var dbDynamo =''; 
      dbExp = new RegExp('(DATABASE:.*)','gm'); 
      dbDynamo = string.match(dbExp); 
      cleanBreaks = new RegExp('(\r?\n|\r)','gm'); 
      stringNow = dbDynamo.toString(); 
      //console.log(dbDynamo); 
      dbDynamo = dbDynamo.map(function(el){return el.replace('DATABASE:','');}); 

      var outArray = []; 
      for(i=0; i < dbDynamo.length; i++){ 
       if ($.inArray(dbDynamo[i],outArray)== -1){ 
        outArray.push(dbDynamo[i]); 
        } 
       } 

      dbDynamo = outArray.sort(); 

      var options = ''; 
      for(i=0; i<dbDynamo.length; i++){ 
       options += '<option value="' + dbDynamo[i] + '">' + dbDynamo[i] + '</option>'; 
      }; 
      $(select).append(options); 


}); 

當我分析第二次獲得所有與特定數據庫相關的字符串的問題就來了。我結束了在每一個字符串前面斷行,這樣當我填寫一個文本與自動填充文本啓動第二行:

Array [ " 

NL:Show company with complaint against Debt collection product.,DATABASE:consumer", " 

NL:Show issues and dates of complaints about HSBC companies.,DATABASE:consumer", " 

NL:Show companies, issues and dates with consumer concerns.,DATABASE:consumer", " 

NL:Show issues and companies with complaints in MA state." ] 

$(document).ready(function(){ 
     $.get('inputQueryExamples.txt',function(data){ 
      var queryString = data; 
      var cleanString = ""; 
      var db = ''; 
      $('#database-list').change(function(){ 
       db = $('#database-list').val(); 

       // /(^DATABASE:.*\r\n)(^NL.*)/gm 
       // http://regex101.com/r/mN4hS2 

       regex = new RegExp('(^DATABASE:'+ db +'\r\n)(^NL.*)' ,'gm'); 

       cleanString = queryString.match(regex); 
       //console.log(cleanString); 
       //cleanBreaks = new RegExp('(\r\n|\r|\n)(^NL.*)','gm'); 
       //stringNow = cleanString.toString(); 
       //var dirtyString 
       //dirtyString = stringNow.match(cleanBreaks); 
       //console.log(dirtyString); 

       var nlString = cleanString.map(function(el) {return el.replace('DATABASE:' + db,'');}); 
       nlString = nlString.map(function(el){return el.replace('NL:',''); }); 
       //nlString = nlString.map(function(el){return  el.replace('\\r','').replace('\\n','');}); 

       console.log(nlString.pop()); 
       $('#query-list').autocomplete({ 
       source:nlString, 

       }); 

      }); // end change 

我曾嘗試一切我能想到的擺脫斷線沒有成功。任何想法,將不勝感激。不幸的是,服務器端以可用格式向我提供數據的那個不可行。這裏有很多額外的代碼只是爲了讓你瞭解我所嘗試過的東西。我已經評論了無用的東西。提前致謝。

回答

1

使用JavaScript解析數據結構將首先分析給JavaScript對象是有意義的,然後您可以更輕鬆地處理數據。

Here is a jsfiddle演示將數據解析爲JavaScript對象。下面是解析的相關代碼:

var datasources = {}; 

var parseData = function(block) { 
    var db = block.match(/DATABASE:(.*)/)[1]; 
    var dbdata = {id: 0, nl: "", sql: ""}; 

    if (!datasources[db]) { 
     datasources[db] = []; 
    } 

    dbdata.id = block.match(/QUERY:(.*)/)[1]; 
    dbdata.nl = block.match(/NL:(.*)/)[1]; 
    dbdata.sql = block.match(/SQL:(.*)/)[1]; 

    datasources[db].push(dbdata); 
}; 

var parseBlocks = function(data) { 
    var result = data.split('\n\n'); 
    for(var i=0; i < result.length; i++) { 
     parseData(result[i]); 
    }; 
}; 
0

感謝您的非常周到和優雅​​的方法。我繼續採取暴力手段。

取代:

nlString = nlString.map(function(el){return el.replace('NL:',''); }); 

有:

nlString = nlString.map(function(el){return el.replace('NL:','').trim(); });