2010-06-01 52 views

回答

6

要看你用線是什麼意思。對於簡單的換行符,Robusto的答案很好。

如果你想知道有多少行表示CSV數據,事情可能會有點困難,作爲一個CSV場自身也可以包含換行符:

field1,"field 
two",field3 

...是一個行,至少在CSV中定義爲RFC4180。 (這是CSV的加重特性之一,有很多非標準變體; RFC本身對遊戲來說很晚)。

所以如果你需要應付這種情況,你將不得不基本解析每個領域。

一個字段可以是原始的,或者(如果它包含\n,)引用,或者"表示爲雙引號。因此,對於一個場正則表達式是:

"([^"]|"")*"|[^,\n]* 

等了整整一個行(假設它不爲空):

("([^"]|"")*"|[^,\n]*)(,("([^"]|"")*"|[^,\n]*))*\n 

,並獲得這些數量:

var rowsn= csv.match(/(?:"(?:[^"]|"")*"|[^,\n]*)(?:,(?:"(?:[^"]|"")*"|[^,\n]*))*\n/g).length; 

如果您足夠幸運能夠處理符合RFC4180建議的CSV變體,並且在未加引號的字段中沒有"字符,則可以使其更具可讀性。像以前一樣拆分換行符並計算每行中的"字符的數量。如果它是偶數,那麼你有一條完整的線;如果它是一個奇數,你有一個分裂。

var lines= csv.split('\n'); 
for (var i= lines.length; i-->0;) 
    if (lines[i].match(/"/g).length%2===1) 
     lines.splice(i-1, 2, lines[i-1]+lines[i]); 
var rowsn= lines.length; 
2

計算行數的文件中(一旦你擁有了它在Javascript中的字符串),簡單地做:

var lines = csvString.split("\n").length; 
+0

很酷。沒有真正想到這個解決方案,我試試看。謝謝! – alvincrespo 2010-06-01 19:54:58

2

您可以使用'。'匹配除了換行符 處的換行符之外的所有內容,它將不會計入新的行。對於多行標誌使用'm',對於全局使用'g'。

function getLines(s){ 
    return s.match(/^(.*)$/mg); 
} 

alert(getLines(string).length) 

如果你不介意跳過空行是simpler- 但有時你需要保持他們spaceing。

function getLines(s){ return s.match(/(.+)/ g); }