1. 需要实现的需求
问题:使用 fs 文件系统模块,将 “学生成绩.txt” 中的成绩数据,按照要求整理到 “学生成绩-已核对.txt” 文件中。
注:学生成绩.txt 的数据格式如下:
整理完成后,希望得到的数据格式如下:
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)
})
(2)转换原文件内容:
将成绩按照空格进行 分割:
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('写入文件成功')
})
3.完整代码
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)
输出:
(2)使用正则表达式作为分隔符
在一些复杂的字符串处理中,单个字符可能无法满足需求,此时我们可以使用正则表达式作为分隔符。
例如:拆分一个包含多种分隔符的字符串:
let str = 'red,orange/yellow|green'
let arr = str.split(/[,/|]/)
console.log(arr)
(3)限制返回的子字符串数量
有时我们可能不需要拆分整个字符串,只需要获取前几个子字符串,此时可以使用limit参数:
例如:返回的数组只包含前三个子字符串:
let str = 'red,orange,yellow,green'
let arr = str.split(',', 3)
console.log(arr)
(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)
注意:
- 原数组不会被改变:
join()方法仅返回一个新生成的字符串,原数组本身不会被修改; - 空数组:如果数组为空,则无论分隔符是什么,
join()方法都会返回一个空字符串(""); - 分隔符为 undefined 或 null :如果分隔符参数为
undefined或null,则会被转换为空字符串(""),因此数组元素之间不会有任何分隔符; - 元素为 undefined 或 null:数组中的
undefined或null元素会被转换为空字符串("")进行连接。