簡體   English   中英

Pentaho-spoon 中的解壓縮文件問題

[英]Unzip file issue in Pentaho-spoon

我正在嘗試解壓縮作業中的文件,一切正常,直到 zip 中的文件名包含一些特殊字符,例如“á、é、í、ó、ú”。 當 zip 中的文件名包含這些字符時,我收到一個錯誤和此日志:

Unzip file - ERROR (version 8.1.0.0-365, build 8.1.0.0-365 from 2018-04-30 09.42.24 by buildguy) : Could not unzip file [file:///C:/pentaho/data/example.zip]. Exception : [MALFORMED]
Unzip file - ERROR (version 8.1.0.0-365, build 8.1.0.0-365 from 2018-04-30 09.42.24 by buildguy) : java.lang.IllegalArgumentException: MALFORMED
Unzip file -    at java.util.zip.ZipCoder.toString(Unknown Source)
Unzip file -    at java.util.zip.ZipFile.getZipEntry(Unknown Source)
Unzip file -    at java.util.zip.ZipFile.access$900(Unknown Source)
Unzip file -    at java.util.zip.ZipFile$ZipEntryIterator.next(Unknown Source)
Unzip file -    at java.util.zip.ZipFile$ZipEntryIterator.nextElement(Unknown Source)
Unzip file -    at java.util.zip.ZipFile$ZipEntryIterator.nextElement(Unknown Source)
Unzip file -    at org.apache.commons.vfs2.provider.zip.ZipFileSystem.init(ZipFileSystem.java:83)
Unzip file -    at org.apache.commons.vfs2.provider.AbstractVfsContainer.addComponent(AbstractVfsContainer.java:49)
Unzip file -    at org.apache.commons.vfs2.provider.AbstractFileProvider.addFileSystem(AbstractFileProvider.java:96)
Unzip file -    at org.apache.commons.vfs2.provider.AbstractLayeredFileProvider.createFileSystem(AbstractLayeredFileProvider.java:80)
Unzip file -    at org.apache.commons.vfs2.provider.AbstractLayeredFileProvider.findFile(AbstractLayeredFileProvider.java:56)
Unzip file -    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:711)
Unzip file -    at org.pentaho.di.core.vfs.ConcurrentFileSystemManager.resolveFile(ConcurrentFileSystemManager.java:91)
Unzip file -    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:648)
Unzip file -    at org.pentaho.di.core.vfs.KettleVFS.getFileObject(KettleVFS.java:152)
Unzip file -    at org.pentaho.di.core.vfs.KettleVFS.getFileObject(KettleVFS.java:109)
Unzip file -    at org.pentaho.di.job.entries.unzip.JobEntryUnZip.unzipFile(JobEntryUnZip.java:626)
Unzip file -    at org.pentaho.di.job.entries.unzip.JobEntryUnZip.processOneFile(JobEntryUnZip.java:525)
Unzip file -    at org.pentaho.di.job.entries.unzip.JobEntryUnZip.execute(JobEntryUnZip.java:470)
Unzip file -    at org.pentaho.di.job.Job.execute(Job.java:676)
Unzip file -    at org.pentaho.di.job.Job.execute(Job.java:817)
Unzip file -    at org.pentaho.di.job.Job.execute(Job.java:493)
Unzip file -    at org.pentaho.di.job.Job.run(Job.java:380)

我該如何解決這個問題?

我正在附上作業的圖像:解壓縮文件作業

鈀。 我已經看過這里和其他論壇。 謝謝

我找到了解決方案,可以幫助某人,所以我發布了它。

  1. 步驟:獲取變量,獲取我需要的參數。
  2. 步驟:用戶定義的 Java 類,在這里我解壓縮文件,更改編碼,這是代碼:

import javax.swing.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.io.IOUtils;


public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{

    Object[] r = getRow();
    if (r == null) {
        setOutputDone();
        return false;
    }
    Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());


    String fname = getVariable("VARIABLE_NAME", null);
    String outDir = getVariable("VARIABLE_NAME", null);


    System.out.println(fname + "  " + outDir);

    try {
            java.io.File inputFile = new java.io.File(fname);
            ZipFile zipFile = new ZipFile(inputFile, "cp866", false);
            Enumeration enumEntry = zipFile.getEntries();
            int i = 0;
            while(enumEntry.hasMoreElements()){
                ZipArchiveEntry entry = (ZipArchiveEntry) enumEntry.nextElement();
                String entryName = entry.getName();
                System.out.println(entryName);
                OutputStream os = new FileOutputStream(new File(outDir, entryName));
                InputStream is = zipFile.getInputStream(entry);
                IOUtils.copy(is, os);


                is.close();
                os.close();
                //Printing output fields
                get(Fields.Out, "FNAME").setValue(outputRow, fname);
                get(Fields.Out, "FileNameUnzipped").setValue(outputRow, entryName);
                putRow(data.outputRowMeta, outputRow);
            }
        } catch (Exception exc) {
            System.out.println("Faild to unzip");
            exc.printStackTrace();
        }


    return true;    
}
  1. 步驟:設置變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM