文章 li dong · 十月 20, 2022 3m read

实现Cache/IRIS中zip文件的下载、解压及读取

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等相关类,具体没有使用过,大家可以考虑使用。

Comments

Dedong Fu · 十月 20, 2022

很棒,get到新技能。。。yes

0