2010-06-01 54 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); }