在nodejs中从巨大的文本文件中读取数字

kxkpmulp  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(247)

我尝试在TypeScript / nodejs中读取一个相当大的文本文件。这是我目前的做法:

new Promise((resolve, reject) => {
                const stream = createReadStream(`${folder}/${file}`)
                stream.on('error', function(error) {
                    const msg = `error: ${error.message}`
                    console.log(msg)
                    reject(msg)
                })
                stream.on('data', chunk => {
                    //write to coordinates
                        chunk
                        .toString()
                        .split('\n')
                        .map((line: string) => line.split(/[,\s;]+/)) // Accept " ", "," and ";" as delimiter
                        .map((line: string[]) => {
                        
                            const point = [+line[0], +line[1], +line[2]]
                            
                            // console.log(point, bbox, bboxSize)
                            if (isInsideBoundingBox(point, bbox, bboxSize)) {
                                coordinatesList.push({
                                    x: point[0],
                                    y: point[1],
                                    z: point[2],
                                })
                            }
                        })
                })
                stream.on('close', () => {
                    resolve('')
                })
            })

确实管用。我正在阅读的文件大约有40.000行,由这样的行组成:

401438.00 5650223.00 344.68
401439.00 5650223.00 344.78
401440.00 5650223.00 344.87
401441.00 5650223.00 344.93
401442.00 5650223.00 345.00
401443.00 5650223.00 345.08

我现在要做的是把所有的坐标解析成一个{x:number,y:nunmber,z:number}[]数组
但有时它不能正确识别值并返回“null”。我就是不知道为什么。我正在阅读的文本文件非常好。例如,有时在这行中,它返回x:null > 401440.00 5650223.00 344.87,应是344.87。
我唯一能想到的是我对组块的使用有些不可靠。所以我在想它不够大,又做了一个块,忘记了读到的文本文件的一些片段?我真的不知道该如何解决这个问题。
任何想法,我将如何找到错误将是可怕的!
非常感谢!

9jyewag0

9jyewag01#

您的算法假设data事件侦听器接收的每个块都由完整的行组成,但实际情况并非如此。您可以使用readline.createInterface将流拆分为行:

var coordinatesList = [];
readline.createInterface({
  input: fs.createReadStream(`${folder}/${file}`),
  crlfDelay: Infinity
})
.on('line', function(line) {
  line.split(/[,\s;]+/) // Accept " ", "," and ";" as delimiter
    .map((line) => {
      const point = [+line[0], +line[1], +line[2]]
      if (isInsideBoundingBox(point, bbox, bboxSize)) {
        coordinatesList.push({
          x: point[0],
          y: point[1],
          z: point[2],
        })
      }
    })
})
.on('close', () => {
  console.log(coordinatesList);
});

相关问题