在Pentaho-spoon中解压缩文件问题


日耀九洲
2025-03-11 12:52:42 (7天前)
  1. 我正在尝试解压缩作业中的文件,一切都没问题,直到zip中的文件名有一些特殊字符,如“á,é,í,ó,ú”。当zip中的文件名有这些字符时,我得到了...

2 条回复
  1. 0# 12345 | 2019-08-31 10-32



    我找到了解决方案,可以帮助某人,所以我发布了它。




    1. 步骤:获取变量,获取我需要的参数。


    2. 步骤:用户定义的Java类,在这里我解压缩文件,改变编码,这是代码:

    3. </醇>




      1. 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;

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

      3. Object[] r = getRow();
      4. if (r == null) {
      5.     setOutputDone();
      6.     return false;
      7. }
      8. Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
      9. String fname = getVariable("VARIABLE_NAME", null);
      10. String outDir = getVariable("VARIABLE_NAME", null);
      11. System.out.println(fname + "  " + outDir);
      12. try {
      13.         java.io.File inputFile = new java.io.File(fname);
      14.         ZipFile zipFile = new ZipFile(inputFile, "cp866", false);
      15.         Enumeration enumEntry = zipFile.getEntries();
      16.         int i = 0;
      17.         while(enumEntry.hasMoreElements()){
      18.             ZipArchiveEntry entry = (ZipArchiveEntry) enumEntry.nextElement();
      19.             String entryName = entry.getName();
      20.             System.out.println(entryName);
      21.             OutputStream os = new FileOutputStream(new File(outDir, entryName));
      22.             InputStream is = zipFile.getInputStream(entry);
      23.             IOUtils.copy(is, os);
      24.             is.close();
      25.             os.close();
      26.             //Printing output fields
      27.             get(Fields.Out, "FNAME").setValue(outputRow, fname);
      28.             get(Fields.Out, "FileNameUnzipped").setValue(outputRow, entryName);
      29.             putRow(data.outputRowMeta, outputRow);
      30.         }
      31.     } catch (Exception exc) {
      32.         System.out.println("Faild to unzip");
      33.         exc.printStackTrace();
      34.     }
      35. return true;    
      36. }

      37. </code>



      1. 步骤:设置变量。

      2. </醇>

登录 后才能参与评论