用Javascript计算CSV文件中的行数

4

我正在尝试想出一种使用Javascript计算.csv文件中行数的方法,有没有什么有用的技巧或资源可以指导我?

5个回答

11

取决于您对“行”的理解。如果只是简单的换行数,Robusto的回答很好。

如果您想知道这代表多少CSV数据的行数,则可能会更加困难,因为CSV字段本身可能包含换行符:

field1,"field
two",field3

...至少在由RFC4180定义的CSV中是一行。 (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;

我不得不在末尾添加一个 * 以获取最后一行。对我有效的最终正则表达式是:("([^"]|"")*"|[^,\n]*)(,("([^"]|"")*"|[^,\n]*))*\n* - Carme

5

如果您在Javascript中将文档作为字符串,要计算行数,只需执行以下操作:

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

啊,很酷。我真的没有想到那个解决方案,我会试一下的。谢谢! - alvincrespo
3
当csv的值中存在换行符时,这将不能给出正确的结果。 - Prashant Prabhakar Singh

2
你可以使用 '.' 匹配除了行尾的换行符以外的所有内容 - 这不会计算引用的换行符。使用 'm' 来进行多行匹配,同时使用 'g' 进行全局匹配。
function getLines(s){
    return s.match(/^(.*)$/mg);
}

alert(getLines(string).length)

如果您不介意跳过空行,那么它会更简单 - 但有时需要保留它们以保持间隔。

函数获取每一行的内容:

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

1
这是一段TypeScript的示例代码。
需要使用FileReader来获取内容。
返回一个Promise可以轻松等待异步readAsText和onload函数的结果。

const countRowsInCSV = async (csvFile: File): Promise<number> => {
  return new Promise((resolve, reject) => {
    try {
      const reader = new FileReader();

      reader.onload = (event: any) => {
        const cvsData = event.target.result;
        const rowData = cvsData.split('\n');
        resolve(rowData.length);
      };

      reader.readAsText(csvFile);
    } catch (error: any) {
      reject(error);
    }
  });
};


const onChangeFile = (selectedFile: File) => {
  const totalRows = await countRowsInCSV(selectedFile);
}


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接