2014-09-23 29 views
0

我有一個需要解析的CSV文件類型。下面的正是我需要考慮(缺少列標題,引號內換行,丟失數據等)的條件:RegExp適用於String.match,但不適用於String.split

ID,NAME,TITLE,DESCRIPTION,, 
PRO1234,"JOHN SMITH",ENGINEER,"JOHN HAS BEEN WORKING 

HARD ON BEING A GOOD 

SERVENT." 
PRO1235,"KEITH SMITH",ENGINEER,"keith has been working 

hard on being a good 

servent." 
PRO1235,"KENNY SMITH",,"keith has been working 

hard on being a good 

servent." 
PRO1235,"RICK SMITH",,, 

你會發現,有行以及換行說明內部將用於新的數據行。

我寫這個正則表達式查找換行符報價之外,它的偉大工程here

代碼,如何使用Node.js:

var fs = require('fs'); 

function parseCSV(filename){ 
    var rx = new RegExp(/\n(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$)/g); 
    var strFile = fs.readFileSync(filename).toString(); 
    console.log("line feed count via match: " + strFile.match(rx).length); 
    var csv = strFile.split(rx); 

    console.log("csv length: " + csv.length); 
    console.log("csv items ###############################"); 
    csv.forEach(function(e,i,a){ 
     console.log("item e: " + e); 
    }); 
} 

當我運行這個,你」會看到換行計數(按匹配找到的換行)是正確的,即。然而,使用與String.split()相同的RET時,它回來了所得陣列是不穩定的:

line feed count via match: 4 
csv length: 17 
csv items ############################### 
item e: ID,NAME,TITLE,DESCRIPTION,, 
item e: 
PRO1235,"RICK SMITH" 
item e: "RICK SMITH" 
item e: undefined 
item e: PRO1234,"JOHN SMITH",ENGINEER,"JOHN HAS BEEN WORKING 

HARD ON BEING A GOOD 

SERVENT." 
item e: 
PRO1235,"RICK SMITH" 
item e: "RICK SMITH" 
item e: undefined 
item e: PRO1235,"KEITH SMITH",ENGINEER,"keith has been working 

hard on being a good 

servent." 
item e: 
PRO1235,"RICK SMITH" 
item e: "RICK SMITH" 
item e: undefined 
item e: PRO1235,"KENNY SMITH",,"keith has been working 

hard on being a good 

servent." 
item e: PRO1235,"RICK SMITH" 
item e: "RICK SMITH" 
item e: undefined 
item e: PRO1235,"RICK SMITH",,, 

我在做什麼毛病分裂?我的想法是,如果我能確定4個與match()完美配合的換行符,那麼同一個regEx應該提供將字符串「分割」的位置。

+1

重新發明輪子的經典案例。 [爲什麼不使用專用的CSV解析器?](https://code.google.com/p/jquery-csv/) – anubhava 2014-09-23 16:46:19

+0

首先,您不能從中間開始解析字符串。 – sln 2014-09-23 17:01:17

+0

sln - 你能解釋一下你的評論嗎?如果我調用string.split(regExp),如何解析中間的字符串? – neoRiley 2014-09-23 17:10:59

回答

0

感謝anubhava爲他們的答案,這只是正常工作:

var $ = jQuery = require('jquery'); 
var csv = require('./jquery.csv-0.71.min.js'); 
var fs = require('fs'); 

var strFile = fs.readFileSync("./data/TestData.csv").toString(); 
var obj = $.csv.toObjects(strFile); 
var str = JSON.stringify(obj, null, 4); 

console.log("str: " + str); 

誰不喜歡一組新的輪轂?

在我的防守中,我嘗試了3個節點上的工具,並且所有3個都是爲最簡單的情況和文件編寫的。

1

你有太多的捕獲組。 Split在分割字符串時將返回捕獲的組。 請考慮以下簡單示例:

var simpleString = "111aaa222bbb"; 
var regxNoCaptureGroup = /\d+/; 
var regxWithCaptureGroup = /(\d+)/; 
var regxWithNoncapturingGroup = /(?:\d+)/; 

simpleString.split(regxNoCaptureGroup); //["", "aaa", "bbb"] 
simpleString.split(regxWithNoncapturingGroup); //same as above 
simpleString.split(regxWithCaptureGroup); //["", "111", "aaa", "222", "bbb"] - includes captured groups 

您在捕獲組內有捕獲組。請記住,split會找到該組,並將其移除以找到拆分部分,因此拆分數字(如第一個示例中所示)將僅返回字母。 在你的情況下,它將刪除捕獲的內容。 對於捕獲組,它會將結果返回給它們 - 所以如果你打算使用正則表達式分割,你應該建立一個很好的正則表達式,它只捕獲需要的東西。

+0

謝謝Etai,我會看看我的regExp - 我很感謝你的解釋和時間 - 這確實有道理。 – neoRiley 2014-09-23 17:18:08

+0

np。既然它回答你關於分裂vs比賽的問題,請隨時將其標記爲接受的答案:) – Etai 2014-09-23 17:19:05

相關問題