进阶-CSV和EXCEL处理

CSV

$csv提供了关于csv格式操作的读和写操作, 有两个函数: writeread

过调用$csv.write()函数来将数据写成csv的格式, 参数可以不传入, 也可以传入文件路径, 或者传入一个实现了Writer接口的对象

这个函数返回了[csvWriter, error], 一般使用with ... as ...或者assert来处理

csvWriter包含以下函数:

  • write 写入一行数据
  • flush 将缓存区的数据写入
  • close 关闭写入
  • bytes(如果参数不是文件路径才有) 读取整个写入的结果
  • writeAll 写入多行数据, 参数要求为[][]string

此外还有以下成员变量:

  • writer 可以获取到原生对象
  • buff(如果参数不是文件路径才有) 获取到内存中的写入缓冲区

输出完毕之后, 别忘了调用flush函数, 如果是输出到文件, 最后要调用close, 才能确保内容被写入、开启的文件被关闭

示例代码

// 写到内存
var w = assert($csv.write()) // 不传参数
// defer w.close() // 如果是写文件, 可以用defer确认关闭
assert(w.write("姓名", "年龄"))
assert(w.write("xxx", "22"))
for (var i = 0; i < 10; i++)
    assert(w.write(`人物${i}`, 100+i))
w.flush()
var result = w.bytes().s
print(result)

// 写到文件
with assert($csv.write("test.csv")) as w {
    assert(w.write("姓名", "年龄"));
    ["张三", "李四"].map((e,i)=>w.write(e, 100+i))
}

$csv.read 函数提供了读取csv格式文件/二进制流并解码的能力

可以传入以下参数:

  • 文件路径
  • []byte
  • 实现了Reader接口的对象

函数返回了[csvReader, error], 一般使用with ... as ...或者assert来处理

csvReader包含以下函数:

  • read 读取数据
  • readAll 读取全部数据
  • close 关闭(文件)

此外还有以下成员变量:

  • reader 可以获取到原生对象

如果是从文件读取, 使用完毕之后, 别忘了调用close函数, 建议使用with ... as ...defer 保证关闭

示例代码

// 从文件中读取
with assert($csv.read("test.csv")) as r {
	for {
		var [line, error] = r.read()
		if (error) {
			print(`文件读取结束:`, error.Error())
			break
		} else {
			print(`读取到一行:`, line)
		}
	}
}

// 从内存读取并一次性读取全部
var content = `张三,888
李四,999
王五,777`.bs // 转成[]byte格式, 以避免被认为是文件路径

var result = assert(assert($csv.read(content)).readAll())
print(`所有数据:`, result) // 读取到[][]string
print(result.map([n, e]=>`姓名: ${n}, 备注: ${e}`).join('\n'))

EXCEL

excel的支持(xlsxlsx文件的读写)需要安装插件, 稍后会完善这方面的文档