文章
· 十月 20, 2022 阅读大约需 3 分钟

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

讨论 (2)3
登录或注册以继续