IRIS中实现zip文件的下载、解压及读取
0 前言
项目上做对账需求时,需要通过http方式下载第三方的对账的文件,是一个压缩文件,里边包含一个csv文件。
1 准备工作
1.1 安装解压缩软件
需要根据cache/iris服务器运行环境安装不同的解压缩软件。
本文是在windows环境下实现的,安装了WinRAR解压缩软件,安装目录为:”C:\Program Files\WinRAR“。
1.2 部署测试http服务器
部署一个web服务器,放一个zip文件。
本文在macOS系统中使用MAMP部署了一个简单的服务器,提供一个对外服务:http://192.168.1.107:8888/sss/Archive.zip
2 下载zip文件
主要思路:
通过http下载zip文件,然后另外到服务器上指定的文件夹下,并重命名。
代码
/// d ##class(web.test.DownloadFile).DownloadFile()
ClassMethod DownloadFile()
{
set filePath="E:\testdata"
set fileName="BCMData"_$zd(+$h,8)_".zip"
Set httprequest=##class(%Net.HttpRequest).%New()
set httprequest.Port=8888
Set httprequest.Server="192.168.1.107"
set httprequest.ContentCharset="UTF-8" ;编码字符集
set status= httprequest.Get("/sss/Archive.zip")
//w !,status
set dataStream = ##class(%Stream.GlobalCharacter).%New()
Set dataStream=httprequest.HttpResponse.Data
Set stream=##class(%FileBinaryStream).%New()
Set stream.Filename=filePath_"\"_fileName
Set status=stream.CopyFromAndSave(dataStream)
//解压文件
d ##class(web.test.DownloadFile).UnZip(filePath,fileName)
}
2 解压zip文件
主要思路:
使用$zf(-1)命令解压文件到指定的目录。
代码
/// d ##class(web.test.DownloadFile).UnZip("E:\testdata","myfile20220909.zip")
ClassMethod UnZip(zipFilePath As %String, zipFileName As %String)
{
set zipFile=zipFilePath_"\"_zipFileName
set targetDir=zipFilePath_"\"_$p(zipFileName,".",1)
set file=##class(%File).%New()
if file.DirectoryExists(targetDir) do
.;如果目录存在先删除
.//set status=file.RemoveDirectory(targetDir)
.set status=file.RemoveDirectoryTree(targetDir)
;创建目录
set status=file.CreateDirectory(targetDir)
//set execCode="""C:\Program Files\WinRAR\WinRAR.exe"" x -t -o-p "_zipFile_" *.txt "_targetDir //只解压txt文件
set execCode="""C:\Program Files\WinRAR\WinRAR.exe"" x -t -o-p "_zipFile_" "_targetDir //所有文件
//SET execCode=##class(%Library.File).NormalizeFilenameWithSpaces(execCode)
//w execCode,!
WRITE $ZF(-1,execCode) //解压文件
do file.Close()
//读取csv文件
do ..ReadFile(targetDir)
}
3 读取zip文件
主要思路:
只读取文件夹中的csv文件,读取时注意文件编码格式。
代码
/// d ##class(web.test.DownloadFile).ReadFile("E:\testdata\myfile20220909")
ClassMethod ReadFile(fileDir As %String)
{
set file=##class(%File).%New()
if file.DirectoryExists(fileDir) {
set num=file.GetDirectoryLength(fileDir)
set rset=##class(%ResultSet).%New("%Library.File:FileSet")
do rset.Execute(fileDir)
while(rset.Next()) {
set fileName=rset.Data("Name") //文件名
set filepx=$p(fileName,".",2)
if (filepx="csv"){
Set tmpfile=##class(%File).%New(fileName)
Do tmpfile.Open("R:/IOTABLE=""UTF8""") //指定文件编码
while ('tmpfile.AtEnd){
set tmpline=tmpfile.ReadLine()
;
//过滤注释行
continue:$e(tmpline,1,1)="#"
//过明细列表头
continue:$e(tmpline,1,1)=""
//w !,tmpline
set tradetime=$p($p(tmpline,",",1),"`",2)
set tradetfinishime=$p($p(tmpline,",",2),"`",2)
set hisTradeNo=$p($p(tmpline,",",7),"`",2)
set tradeNo=$p($p(tmpline,",",8),"`",2)
w !,tradetime_" "_tradetfinishime_" "_hisTradeNo_" "_tradeNo
}
do tmpfile.Close()
}
}
}else{
w !,"目录不存在"
}
do file.Close()
}
4 其他
此方法也可以在cache中使用。
另外,IRIS提供HS.Util.Zip.Adapter等相关类,具体没有使用过,大家可以考虑使用。
新方法get√
很棒,get到新技能。。。