Как объединить строку из path to directory и несколько имен zip-файлов в каталоге?

#java #string

#java #строка

Вопрос:

Я работаю над некоторым скриптом для распыления ручной функции, которую мне нужно выполнять почти ежедневно.

Моя первая проблема заключается в создании строки из Path и имени zip-файла. Вторая проблема заключается в циклическом просмотре имен zip-файлов (путь имя zip-файла).

Это путь к каталогу с несколькими zip-файлами: /Users/John.Smith/Desktop/Test_script/

Вот имя одного из многих zip-файлов: CRM_CI_20161016_000001_50661561.zip

В конце мне нужно перебрать каталог и вложенную строку из каждого zip-файла, присвоив ему номер 50661561 , чтобы манипулировать им.

Может кто-нибудь дать мне предложение по этому поводу?

Ниже приведен мой код для управления только одним zip-файлом:

 import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResu<

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;



public class UnzipUtilityTest {
    public static void main(String[] args) {



  // unzip file 

        String zipFilePath = "/Users/John.Smith/Desktop/Test_script/CRM_CI_20161016_000001_50661561.zip";
        String destDirectory = "/Users/John.Smith/Desktop/Test_script/test";
        UnzipUtility unzipper = new UnzipUtility();


        try {
            unzipper.unzip(zipFilePath, destDirectory);
        } catch (Exception ex) {

            System.out.println("ERROR:Unzip did not work");
        }


 // read provider id       
        String old_prov_id = zipFilePath.substring(66, 74);
        System.out.println("Old provider ID :" old_prov_id );

 // add  1 to provider ID
        int new_provider_ID = Integer.parseInt(old_prov_id);
        new_provider_ID  ;
        System.out.println("New provider ID :" new_provider_ID );


 // convert provider-id INT into String   

      String str_provider_id = Integer.toString(new_provider_ID);  
      System.out.println("New String provider ID :" str_provider_id );  

 // concatenate two String into one
        StringBuilder bufferPDF = new StringBuilder()
                .append(new_provider_ID).append(".pdf");
            System.out.println(bufferPDF.toString()); 

            StringBuilder bufferXML = new StringBuilder()
                    .append(new_provider_ID).append(".xml");
                System.out.println(bufferXML.toString()); 

  // convert names of XML and PDF      

       Path sourcePDF = Paths.get("/Users/John.Smith/Desktop/Test_script/test/50661561.pdf");
        try {
            Files.move(sourcePDF, sourcePDF.resolveSibling(bufferPDF.toString()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Path sourceXML = Paths.get("/Users/John.Smith/Desktop/Test_script/test/50661561.xml");
        try {
            Files.move(sourceXML, sourceXML.resolveSibling(bufferXML.toString()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    // change provider-id and filename in xml file    

           try {

                String filepath = "/Users/John.Smith/Desktop/Test_script/test/50661562.xml";

                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
                Document doc = docBuilder.parse(filepath);

                // Get the root element provider-id 
                Node provider = doc.getElementsByTagName("provider-id").item(0);
                provider.setTextContent(str_provider_id);

                // Get the root element filename
                Node filename = doc.getElementsByTagName("filename").item(0);
                filename.setTextContent(str_provider_id);


                // write the content into xml file
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                DOMSource source = new DOMSource(doc);
                StreamResult result = new StreamResult(new File(filepath));
                transformer.transform(source, result);

                System.out.println("Done");

               } catch (ParserConfigurationException pce) {
                pce.printStackTrace();
               } catch (TransformerException tfe) {
                tfe.printStackTrace();
               } catch (IOException ioe) {
                ioe.printStackTrace();
               } catch (SAXException sae) {
                sae.printStackTrace();
               }            

          }               
    }
  

Ответ №1:

Я бы подошел к этому немного по-другому:

  1. Перечислите все файлы в каталоге
  2. Перебирайте элементы в списке файлов
  3. Извлеките старый идентификатор и увеличьте его
  4. Обработать новый идентификатор

Пример:

 //you could probably make this nicer

String fileNamePattern = "CRM_CI_\d{8}_\d{6}_\d{8}\.zip";
String oldProvIdPattern = "CRM_CI_\d{8}_\d{6}_(\d{8})\.zip";

String pathToZips = "/Users/John.Smith/Desktop/Test_script/"
String destinationPath = "/Users/John.Smith/Desktop/Test_script/test";

File dir = new File(".");
FileFilter fileFilter = new RegexFileFilter(fileNamePattern);
File[] files = pathToZips.listFiles(fileFilter);
for (File file : files) {
    //Handle each zip here
    String zipPath = file.getAbsolutePath();  


    try {
        unzipper.unzip(zipPath, destinationPath);
    } catch (Exception ex) {
        System.out.println("ERROR:Unzip did not work");
    }

    Pattern pattern = Pattern.compile(oldProvIdPattern);
    Matcher matcher = pattern.matcher(file.getName());
    if (matcher.find()){
        String old_prov_id = matcher.group(1);
        System.out.println("Old provider ID :" old_prov_id );

        // add  1 to provider ID
        int new_provider_ID = Integer.parseInt(old_prov_id);
        new_provider_ID  ;
        System.out.println("New provider ID :" new_provider_ID );

        // convert provider-id INT into String   

        String str_provider_id = Integer.toString(new_provider_ID);  
        System.out.println("New String provider ID :" str_provider_id );  

        // concatenate two String into one
        StringBuilder bufferPDF = new StringBuilder()
                .append(new_provider_ID).append(".pdf");
            System.out.println(bufferPDF.toString()); 

            StringBuilder bufferXML = new StringBuilder()
                    .append(new_provider_ID).append(".xml");
                System.out.println(bufferXML.toString()); 

        // convert names of XML and PDF      

       Path sourcePDF = Paths.get("/Users/John.Smith/Desktop/Test_script/test/"   old_prov_id   ".pdf");
        try {
            Files.move(sourcePDF, sourcePDF.resolveSibling(bufferPDF.toString()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Path sourceXML = Paths.get("/Users/John.Smith/Desktop/Test_script/test/"   old_prov_id   ".xml");
        try {
            Files.move(sourceXML, sourceXML.resolveSibling(bufferXML.toString()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // change provider-id and filename in xml file    

        try {

        String filepath = "/Users/John.Smith/Desktop/Test_script/test/"   old_prov_id   ".xml";

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(filepath);

        // Get the root element provider-id 
        Node provider = doc.getElementsByTagName("provider-id").item(0);
        provider.setTextContent(str_provider_id);

        // Get the root element filename
        Node filename = doc.getElementsByTagName("filename").item(0);
        filename.setTextContent(str_provider_id);


        // write the content into xml file
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(filepath));
        transformer.transform(source, result);

        System.out.println("Done");

       } catch (ParserConfigurationException pce) {
        pce.printStackTrace();
       } catch (TransformerException tfe) {
        tfe.printStackTrace();
       } catch (IOException ioe) {
        ioe.printStackTrace();
       } catch (SAXException sae) {
        sae.printStackTrace();
       }            

      }  
}
  

Комментарии:

1. Вы также могли бы заменить все экземпляры «/Users /John. Smith/Desktop /Test_script /test» с переменной DestinationPath

2. Привет, Vio, tnx за быстрый ответ. Все выглядит хорошо, но я получаю следующую ошибку «Недопустимая escape-последовательность (допустимыми являются b t n f r » ‘ \)» для fileNamePattern и oldProvIdPattern.

3. Все обратные косые черты » необходимо экранировать другой обратной косой чертой «\»

Ответ №2:

Если вы правильно поняли, ваша основная проблема в том, что у вас есть строка типа

 CRM_CI_20161016_000001_50661561.zip
  

И вы хотите получить 50661561

Если это так, вы можете просто использоватьметод String.lastIndexOf(). Просто выполните

 String input = "CRM....
int indexOfLastUnderScore = input.lastIndexOf('_');
int indexOfZipExtension = input.lastIndexOf('.');
String substringWithNumer = input.substring(indexOfLastUnderScore 1, indexOfZipExtension);
  

Конечно, здесь вы также можете обратиться к регулярным выражениям, но я думаю, что использование чего-то вроде приведенного выше кода в небольшом вспомогательном методе более удобно в долгосрочной перспективе.

( подсказка: я не прогонял свой код через компилятор; поэтому остерегайтесь опечаток или незначительных ошибок типа «отключено на единицу»; но этого должно быть достаточно, чтобы вы начали)

Комментарии:

1. Tnx для быстрого ответа. Моя первая проблема — это строка, которую необходимо объединить из пути и имени zip-файла. Вторая проблема заключается в циклическом повторении имен zip-файлов (путь имя zip-файла).