2016-02-26 68 views
0

串線,我用Node.js的工作,有以下代碼塊拉從一個數據庫位置的字符串,剝去某些垃圾並將其設置要均勻,這樣我就可以稍後使用此信息更新另一個表。Node.js的逐行讀取

jsUpdateCon.query('SELECT FileContent FROM codeFile WHERE ID = ?',[msg[1]], function(err, result){ 
    if (err) throw err; 
    str = result[0].FileContent; 
    var firstInstance = str.search(/=/) + 2; 
    var lastInstance = str.lastIndexOf('\\') + 1; 
    str = str.substring(firstInstance, lastInstance); 
    str = str.replace(/\\n\\/g, ""); 
    str = str.replace(/\#(.*)/g, ""); 
    str = str.replace(/\n\s*\n/g, "\n"); 
    str = str.replace(/snippet /g, "\nsnippet "); 
    str = str.replace(/^(?:\t)/gm, ""); 

    console.log(str); 
}); 

下面是輸出的從console.log(str);

snippet cfabort 
<cfabort> 

snippet cfargument 
<cfargument name=\"${1:ArgName}\" type=\"${2:any}\" default=\"${3:DefaultValue}\" hint=\"${4:hint about this argument}\"> 

snippet cfbreak 
<cfbreak> 

snippet cfcase 
<cfcase value=\"${1:${SELECTED_TEXT:<!--- code --->}}\"> 
     ${0} 
</cfcase> 

snippet cfcatch 
<cfcatch> 
     ${0} 
</cfcatch> 

snippet cfcatch:type 
<cfcatch type=\"${1:any}\"> 
     ${0} 
</cfcatch> 

snippet cfcomponent 
<cfcomponent> 
     ${0:<!--- code --->} 
</cfcomponent> 

snippet cfcontent 
<cfcontent deleteFile=\"${1:no}\" file=\"${2:filename}\" reset=\"${3:yes}\" type=\"${4:fileType}\" variable=\"${5:variableName}\"> 

snippet cfcontinue 
<cfcontinue> 

snippet cfdefaultcase 
<cfdefaultcase> 

snippet cfdirectory:c 
<cfdirectory directory=\"${1:pathToDirectory}\" action=\"${2:copy}\" destination=\"${3:destinationPath}\"> 

snippet cfdirectory:cr 
<cfdirectory directory=\"${1:pathToDirectory}\" action=\"${2:create}\" > 

snippet cfdirectory:d 
<cfdirectory directory=\"${1:pathToDirectory}\" action=\"${2:delete}\" recurse=\"${3:yes|no}\"> 

snippet cfdirectory:l 
<cfdirectory directory=\"${1:pathToDirectory}\" action=\"${2:list}\" name=\"${3:nameOfOutputSet}\" recurse=\"${4:yes|no}\" sort=\"${3:asc|desc}\" > 

snippet cfdirectory:r 
<cfdirectory directory=\"${1:pathToDirectory}\" action=\"${2:rename}\" newDirectory=\"${3:newNameforDirectory}\"> 

snippet cfdump 
<cfdump var=\" 

snippet cfelse 
<cfelse> 
    ${0:<!--- code --->} 

我現在需要解析這個字符串插入到數據庫表中的樣品。

以snippet [空格]開頭的任何行(如「snippet cfabort」) - >插入keyboardShortcuts.keyShort,如「cfabort」(刪除片段[空格])。

之後的每一行(不包括組之間的空白行) - >插入到鍵盤快捷鍵.snippet,如「<cfabort>」保持組的格式。

再破一個空行到下一個片段開始的下一行的數據表。

難道我使用的的NodeJS readline?這似乎只使用文件流而不是內存中的字符串。

我還使用別的東西嗎?什麼是完成這個最好的方法?


當前工作守則與阿卜杜拉沙欣的回答是:

jsUpdateCon.query('SELECT FileContent FROM codeFile WHERE ID = ?',[msg[1]], function(err, result){ 
    if (err) throw err; 

    str = result[0].FileContent; 
    var firstInstance = str.search(/=/) + 2; 
    var lastInstance = str.lastIndexOf('\\') + 1; 
    str = str.substring(firstInstance, lastInstance); 
    str = str.replace(/\\"/g, "\""); 
    str = str.replace(/\</g, "&lt;"); 
    str = str.replace(/\>/g, "&gt;"); 
    str = str.replace(/\\n\\/g, ""); 
    str = str.replace(/^\#(.*)/gm, ""); 
    str = str.replace(/\n\s*\n/g, "\n"); 
    str = str.replace(/^(?:\t)/gm, ""); 
    str = str.trim(); 

    str = str.replace(/^\s*[\r\n]/gm,""); 

    var object = {}; 
    var tempArray = str.split("\n"); 
    var currentObj = ""; 
    for(var i=0; i<tempArray.length;i++){ 
     if(/snippet /g.test(tempArray[i])){ 
      currentObj = tempArray[i].replace(/snippet /g, ""); 
      object[currentObj] = ""; 
     } else { 
      object[currentObj] += tempArray[i]; 
     } 
    } 
}); 
+0

使用['.split'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split) –

回答

1

希望這會有所幫助,這個代碼將它解析爲一個對象,所有片段的關鍵是,你可以找到所有值的特定片段匹配關鍵

var object = {}; 
    text = text.replace(/^\s*[\r\n]/gm,""); 
    var array = text.split("\n"); 
    var currentObj = ""; 
    for(var i=0;i<array.length;i++) 
    { 
     if(/snippet /g.test(array[i])) 
     { 
      currentObj = array[i].replace(/snippet /g,""); 
      object[currentObj] = ""; 
     } 
     else 
     { 
      object[currentObj] += array[i]; 
     } 
    } 
    console.log(object) 

這是輸出

{ 
    cfabort: '<cfabort>', 
    cfargument: '<cfargument name=\\"${1:ArgName}\\" type=\\"${2:any}\\" default=\\"${3:DefaultValue}\\" hint=\\"${4:hint about this argument}\\">', 
    cfbreak: '<cfbreak>', 
    cfcase: '<cfcase value=\\"${1:${SELECTED_TEXT:<!--- code --->}}\\">  ${0}</cfcase>', 
    cfcatch: '<cfcatch>  ${0}</cfcatch>', 
    'cfcatch:type': '<cfcatch type=\\"${1:any}\\">  ${0}</cfcatch>', 
    cfcomponent: '<cfcomponent>  ${0:<!--- code --->}</cfcomponent>', 
    cfcontent: '<cfcontent deleteFile=\\"${1:no}\\" file=\\"${2:filename}\\" reset=\\"${3:yes}\\" type=\\"${4:fileType}\\" variable=\\"${5:variableName}\\">', 
    cfcontinue: '<cfcontinue>', 
    cfdefaultcase: '<cfdefaultcase>' 
} 
+0

問題是像片斷捕獲一些值覆蓋多個行,以便它甚至不工作/奇 – shaun

+0

我的答案更新,希望它有助於 –

+0

對象沒有被定義 – shaun