如何使用Node.js的内置模块fs实现读写文件(附加自己总结的split/join的基本使用方法)

230 阅读5分钟

1. 需要实现的需求

问题:使用 fs 文件系统模块,将 “学生成绩.txt” 中的成绩数据,按照要求整理到 “学生成绩-已核对.txt” 文件中。

注:学生成绩.txt 的数据格式如下:

image.png

整理完成后,希望得到的数据格式如下:

image.png

2.核心实现步骤

  • 导入需要的 fs 文件系统模块
  • 使用 fs.readFile() 方法读取 “学生成绩.txt” 文件
  • 判断文件是否读取成功
  • 文件读取成功后,按要求处理数据
  • 将处理完成后的成绩数据,调用 fs.writeFile() 方法,写入新文件中

(1)读取文件并判断文件是否读取成功:

const fs = require('fs')

fs.readFile('学生成绩.txt', 'utf8',function (err, data) {
  if (err) console.log('读取文件失败:', err.message)
  console.log(data)
})

image.png

(2)转换原文件内容:

将成绩按照空格进行 分割

let dataArr = data.split(' ')
console.log(dataArr)

image.png

对分割后的数组进行循环 替换

let newArr = []
  dataArr.forEach(item => {
    newArr.push(item.replace('=', ':'))
  })
  console.log(newArr)

image.png

把数组中的每一项进行 合并,得到新字符串:

  let str = newArr.join('\r\n')
  console.log(str)

image.png

将转换后的数据 写入 文件:

  fs.writeFile('学生成绩 - 已核对.txt', str, 'utf8', function (err, dataN) {
    if (err) return console.log('文件写入失败:', err.message)
    console.log('写入文件成功')
  })

image.png

3.完整代码

image.png

const fs = require('fs')

fs.readFile('学生成绩.txt', 'utf8', function (err, data) {
  if (err) console.log('读取文件失败:', err.message)
  // console.log(data)

  let dataArr = data.split(' ')
  // console.log(dataArr)
  let newArr = []
  dataArr.forEach(item => {
    newArr.push(item.replace('=', ':'))
  })
  // console.log(newArr)

  let str = newArr.join('\r\n')
  // console.log(str)

  fs.writeFile('学生成绩 - 已核对.txt', str, 'utf8', function (err, dataN) {
    if (err) return console.log('文件写入失败:', err.message)
    console.log('写入文件成功')
  })
})

4.附加 split、replace、join 的用法

4.1 split 常见用法

在JavaScript中,使用split方法来 拆分字符串 ,可以根据特定的分隔符将字符串转换为 数组 ,并返回一个包含这些子字符串的数组。其语法如下:

string.split(separator, limit)
  • separator:表示分隔符,这是一个字符串或正则表达式。可以是一个字符,如逗号(,),或者是一个正则表达式。
  • limit:可选参数,用于限制返回的子字符串的数量。

(1)单个分隔符

例如:用逗号作为分隔符,将字符串str拆分成一个包含四个元素的数组:

let str = 'red,orange,yellow,green'
let arr = str.split(',')
console.log(arr)

输出:

image.png

(2)使用正则表达式作为分隔符

在一些复杂的字符串处理中,单个字符可能无法满足需求,此时我们可以使用正则表达式作为分隔符。

例如:拆分一个包含多种分隔符的字符串:

let str = 'red,orange/yellow|green'
let arr = str.split(/[,/|]/)
console.log(arr)

image.png

(3)限制返回的子字符串数量

有时我们可能不需要拆分整个字符串,只需要获取前几个子字符串,此时可以使用limit参数:

例如:返回的数组只包含前三个子字符串:

let str = 'red,orange,yellow,green'
let arr = str.split(',', 3)
console.log(arr)

image.png

(4)解析URL参数 - 可以使用split方法来实现

首先使用split("?")方法将URL分成路径和查询字符串,然后进一步使用split("&")方法将查询字符串拆分成键值对,最后使用split("=")方法解析每个键值对

let url = 'https://example.com?page=1&sort=asc'

function getParams(url) {
  let par = {}
  let queryStr = url.split('?')[1]
  // console.log(url.split('?')) 输出:['https://example.com', 'page=1&sort=asc']
  // console.log(queryStr) 输出:page=1&sort=asc

  if (queryStr) {
    let pairs = queryStr.split('&')
    // console.log(pairs) 输出:['page=1', 'sort=asc']

    pairs.forEach(pair => {
      let [key, value] = pair.split('=')
      // console.log(pair.split('=')) 输出第一个元素:['page', '1']
      // console.log([key, value]) 输出第一个元素:['page', '1']
      // console.log(par) 输出第一个元素:{}
      par[key] = decodeURIComponent(value) // 执行后
      // console.log(par[key]) 输出第一个元素: 1
      // console.log(par) 输出第一个元素:{ page: '1' }
    })
  }
  return par
}

let parS = getParams(url)
console.log(parS) // 输出: { page: "1", sort: "asc" }

(5)处理CSV数据

CSV(逗号分隔值)是常用的数据格式之一,我们可以使用split方法来处理,首先使用split("M")方法将CSV数据按 拆分,然后对每一行使用split(",")方法将其按 拆分。

let csvData = 'name,age,cityMAlice,30,New YorkMBob,25,Los Angeles'
function parseCSV(data) {
  let rows = data.split('M') 
  // console.log(rows) ['name,age,city', 'Alice,30,New York', 'Bob,25,Los Angeles']
  return rows.map(row => row.split(','))
}

let parsedData = parseCSV(csvData)
console.log(parsedData)
// 输出: [["name", "age", "city"], ["Alice", "30", "New York"], ["Bob", "25", "Los Angeles"]]

(6)注意点

当分隔符出现在字符串的开头或结尾时,会产生 空字符串,要过滤掉这些空字符串,可以使用filter方法来实现:

let str = 'nappnlesndvn'
let arr = str.split('n')
console.log(arr) // 输出: ['', 'app', 'les', 'dv','']

let arrN = arr.filter(Boolean)
console.log(arrN) // [ 'app', 'les', 'dv' ]

有时字符串中可能包含连续的分隔符,这会导致生成空字符串,这时可以使用正则表达式来处理 多重分隔符

let str = 'appnnlesnnnndv'
let arr = str.split('n')
console.log(arr) // 输出: ['app', '','les', '','','','dv']

let arrN = str.split(/n+/) // 正则表达式`/n+/`匹配一个或多个n,从而避免了生成空字符串
console.log(arrN) // 输出: ['app', 'les', 'dv']

4.2 join 常见用法

join() 方法是将数组中的所有元素连接成一个字符串,并返回这个新生成的字符串。

元素之间通过指定的分隔符进行分隔;如果未提供分隔符,则默认使用逗号(,)作为分隔符。

基本语法:array.join([separator])

  • array:需要连接的数组。
  • separator(可选):指定一个字符串来分隔数组的每个元素。如果省略该参数,则使用逗号(,)作为分隔符。
let colors = ['红色', '黄色', '白色', '绿色']
let color1 = colors.join()
console.log(color1)

let color2 = colors.join(', ')
console.log(color2)

let color3 = colors.join(' + ')
console.log(color3)

image.png

注意:

  • 原数组不会被改变‌:join() 方法仅返回一个新生成的字符串,原数组本身不会被修改;
  • 空数组‌:如果数组为空,则无论分隔符是什么,join() 方法都会返回一个空字符串("");
  • 分隔符为 undefined 或 null‌ :如果分隔符参数为undefinednull,则会被转换为空字符串(""),因此数组元素之间不会有任何分隔符;
  • 元素为 undefined 或 null‌:数组中的undefinednull元素会被转换为空字符串("")进行连接。