2013-08-13 6 views
0

на данный момент у меня возникла проблема с написанием инструмента для моей компании. У меня есть 384 XML-файла, которые я должен читать и анализировать с помощью SAX Parser в txt-файлы. То, что я получил до сих пор, - это разбор всех XML-файлов в один файл txt размером 43 МБ. С BufferedReader и line.startsWith я хочу извлечь всю соответствующую информацию из текстового файла.Java итеративное чтение файлов

Edit: Готово (Так что моя проблема заключается в том, чтобы решить эту проблему более эффективно у меня идея (но, к сожалению, не в коде, как вы могли подумать), но я не знаю, если ее можно:. Я хочу итерации через каталог, найти XML-файл, который я хочу, затем проанализировать его и создать новый txt-файл с анализируемым контентом. Если это сделано для всех 384 файлов XML, я хочу то же самое для 384 текстовых файлов, прочитайте их с помощью BufferedReader чтобы получить мою релевантную информацию, важно прочитать их по одному. Другая проблема - путь к каталогу, его бит сложный: «C: \ Users \ xxx \ Documents \ Data \ ProjectName \ A1 \ 1 \ 1SLin \ wanted. xml "для каждого файла есть собственный каталог. Переменная A1, она достигает от AP и 1-24. В качестве альтернативы, у меня есть все соответствующие файлы с абсолютным путем в arraylist, поэтому его als о порядке, чтобы пройти по этому списку, если его проще)

Edit:. я пришел к решению: Ниже содержит метод поиска каталогов и метод для разбора XML-файлов из списка в тот же каталог с то же имя, но другое расширение файла

public List<File> searchFile(File dir, String find) { 

    File[] files = dir.listFiles(); 
    List<File> matches = new ArrayList<File>(); 
    if (files != null) { 
     for (int i = 0; i < files.length; i++) { 
      if (files[i].isDirectory()) { 
       matches.addAll(searchFile(files[i], find)); 
      } else if (files[i].getName().equalsIgnoreCase(find)) { 
       matches.add(files[i]); 
      } 
     } 
    } 
    Collections.sort(matches); 
    return matches; 

} 

public static void main(String[] args) throws IOException { 

    Import_Files im = new Import_Files(); 
    File dir = new File("C:\\Users\\xxx\\Desktop\\MS-Daten\\"); 
    String name = "snp_result_5815.xml"; 
    List<File> matches = im.searchFile(dir, name); 
    System.out.println(matches); 

    for (int i=0; i<matches.size(); i++) { 
     String j = String.valueOf(i); 
     String xml_name = matches.get(i).getAbsolutePath(); 
     File f = new File(matches.get(i).getAbsolutePath().replaceFirst(".xml", ".txt")); 
     System.setOut(new PrintStream(new FileOutputStream(f))); 

     System.out.println("\nstarting File: "+ i + "\n"); 
     xml_parse myReader = new xml_parse(xml_name); 
     myReader.setContentHandler(new MyContentHandler()); 
     myReader.setErrorHandler(new MyErrorHandler()); 
     myReader.run(); 
    } 

} 

ответ

0

метод searchFolder ниже займет путь к файлу расширение, поиск пути и все подкаталоги, и передавать любые типы файлов, соответствующий методу processFile.

public static void main(String[] args) { 
    String path = "c:\\temp"; 
    Pattern filePattern = Pattern.compile("(?i).*\\.xml$"); 
    searchFolder(path, filePattern); 
} 

public static void searchFolder(String searchPath, Pattern filePattern){ 
    File dir = new File(searchPath); 
    for(File item : dir.listFiles()){ 
     if(item.isDirectory()){ 
      //recursively search subdirectories 
      searchFolder(item.getAbsolutePath(), filePattern); 
     } else if(item.isFile() && filePattern.matcher(item.getName()).matches()){ 
      processFile(item); 
     } 
    } 
} 

public static void processFile(File aFile){ 
    String filename = aFile.getAbsolutePath(); 
    String txtFilename = filename.substring(0, filename.lastIndexOf(".")) + ".txt"; 
    //Do your xml file parsing and write to txtFilename 
} 

Сложность пути не имеет никакого значения, просто указать корневой путь поиска (выглядит как C:\Users\xxx\Documents\Data\ProjectName в вашем случае), и она найдет все файлы.

+0

Спасибо. еще два вопроса: мне нужно указать имя файла, потому что в каждой директории имеется более одного XML-файла, и я хочу выбрать его вручную. во-вторых, если я выполняю синтаксический анализ в processFile(), как мне это понять? потому что фактическое письмо (system.out.println()) определено в классе contentehandler. Могу ли я определить новый файл в другом классе и установить команду write в классе обработчика содержимого? – MIP

+0

Я обновил код, чтобы использовать регулярное выражение, а не просто соответствие расширению файла. Просто создайте регулярное выражение, которое будет соответствовать нужным вам файлам. Что касается написания файла txt, сделайте это, как вам нравится, в методе 'processFile' вы получите всю необходимую информацию для начала работы. – Syon

+0

спасибо, что у меня есть способ его решить :) – MIP

Смежные вопросы