#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:
Я бы подошел к этому немного по-другому:
- Перечислите все файлы в каталоге
- Перебирайте элементы в списке файлов
- Извлеките старый идентификатор и увеличьте его
- Обработать новый идентификатор
Пример:
//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-файла).