0

我正在尝试从 FTP 服务器解析一个 csv 文件。当文件只有一行数据时,就会出现问题。如果文件有超过 1 行数据,它工作正常。下面的代码完成了这项工作。经过调试,我发现 fromString 方法没有返回任何内容,但是,来自套接字的数据被成功读取。任何帮助表示赞赏

async function getFileData(ftpConnection, filename) {
  return new Promise((resolve, reject) => {
    ftpConnection.get(filename, (err, socket) => {
      const products = [];
      if (err) {
        console.log(err)
        reject(null);
      }
      socket.on('data', data => {
        csv({
          headers: HEADERS,
          delimiter: [';'],
        })
        .fromString(data.toString('latin1'))
        .subscribe((product) => {
          // Product is empty when its only one line
          products.push(product);
        })
      });

      socket.on('close', closingError => {
        if (closingError) {
          console.error('[Error]: ', filename);
          reject(null)
        } else {
          console.log("PRODUCTs")
          console.log(products)
          resolve(products);
        }
      });
      socket.resume();
    });
  });
}
4

2 回答 2

1

默认情况下, csv2json 假定您有一个标题来描述您的 csv 文件。如果您只有一行,则此行被视为标题,因此您没有数据。

noheader您可以通过将选项设置为 来避免这种行为true

csv ( {noheader:true} ).fromString ('1,2,3').then ((csv) => { console.log (csv); });
于 2019-12-18T09:31:50.243 回答
0
const CSV2JSON = async(dumb, editDumb, headers) => {
    try {
        log(`\n\nStarting CSV2JSON - Current directory: ${__dirname} - Please wait..`)

        if (!dumb && !editDumb && !headers) {
            var {dumb, editDumb, headers} = require('minimist')(process.argv.slice(2))
        }

        const options = {
            trim: true,
            delimiter: '|',
            quote: '\'',
            escape: '\'',
            fork: true,
            // output: "csv",
            // eslint-disable-next-line max-len
            headers: Array.isArray(headers) ? headers : JSON.parse(headers)
            // headers: headers,
            // noheader: true
        }

        await new Promise((resolve, reject) => {
            let counter = 0
            lineReader.eachLine(dumb, async(line, last) => {
                log(line)
                counter++

                let json = await csv(options).fromString(headers + '\n\r' + line)

                json = JSON.stringify(json[0])

                if (counter === 1) {
                    // Check for first Line
                    json = `[${json},`
                } else if (last) {
                    // Check for last Line
                    json = `${json}]`
                    resolve()
                } else {
                    // Check for inbetween Line
                    json = `${json},`
                }

                await fs.appendFile(editDumb, json)
            })
        })
    } catch (e) {
        throw new BaseError(`Error while converting CSV to JSON - Error: ${e}`)
    }
}
于 2021-10-30T01:01:11.803 回答