2013-07-17 5 views
1

Я хочу, чтобы получить информацию из сценария, так что я использовал эту функциюПолучить конкретный текст из текстового файла

public static HashMap<String, String> getEnvVariables(String scriptFile,String config) { 
    HashMap<String, String> vars = new HashMap<String, String>(); 
    try { 

     FileInputStream fstream = new FileInputStream(scriptFile); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
     String strLine; 
          String var= "if [ \"$1\" = \""+config +"\" ] ; then"; 
     // Read File Line By Line 
     while ((strLine = br.readLine()) != null) { 
      // use a Scanner to parse the content of each line 
      // exclude concatenated variables (export xx:$xx) 
      if (strLine.startsWith("export") && !strLine.contains("$")) { 
       strLine = strLine.substring(7); 
       Scanner scanner = new Scanner(strLine); 
       scanner.useDelimiter("="); 
       if (scanner.hasNext()) { 
        String name = scanner.next(); 
        String value = scanner.next(); 
        System.out.println(name+"="+value); 
        vars.put(name, value); 
       } 
      } 
     } 

Однако я хочу, чтобы начать чтение с определенной линии, которая

if [ \"$1\" = \""+config +"\" ] ; then 

проблема в том, что когда строка начинается с пробела, программа считает, что файл закончился! Так как я могу исправить это и сделать парсы программы до конца файла? , учитывая, что линия может начинаться с более одного пробела thx

ответ

0

Я нашел решение, которое я разделяю с вами.

public static HashMap<String, String> getEnvVariables(String scriptFile ,String config1,String config2) { 
    HashMap<String, String> vars = new HashMap<String, String>(); 
    BufferedReader br = null; 
    try { 
     FileInputStream fstream = new FileInputStream(scriptFile); 
     br = new BufferedReader(new InputStreamReader(fstream)); 
     String strLine = null; 
     String stopvar = config2; 
     String startvar =config1; 
     String keyword = "set"; 
     do { 
      if (strLine != null && strLine.contains(startvar)) { 
       if (strLine.contains(stopvar)) { 
        return vars; 
       } 
       while (strLine != null && !strLine.contains(stopvar)) { 
        strLine = br.readLine(); 
        if (strLine.trim().startsWith(keyword)&& !strLine.contains("$")) { 
         strLine = strLine.trim().substring(keyword.length()) 
         .trim(); 
         String[] split = strLine.split("="); 
         String name = split[0]; 
         String value = split[1]; 
         System.out.println(name + "=" + value); 
         vars.put(name, value); 
        } 
       } 
      } 
     } while ((strLine = br.readLine()) != null); 
    } catch (Exception e) { 
     Status status = new Status(Status.ERROR, Activator.PLUGIN_ID, 
       IStatus.ERROR, e.getMessage(), e); 
     Activator.getDefault().getLog().log(status); 
    } 
    return vars; 
} 

благодарит за помощь!

2

Вы можете попытаться обрезать нерелевантные пробелы из каждой строки?

while ((strLine = br.readLine().trim()) != null) {...} 

Редактировать: не делайте этого (спасибо Joop Eggen!), Или у вас будет хороший NPE ...). Попытка:

while ((strLine = br.readLine()) != null) { 
    strLine = strLine.trim(); 
    ... 
} 
+0

Хорошая идея, часто забывают простую '.trim()'. Хотя делайте это внутри '{...}', поскольку вы все еще не тестировали для strLine, являющегося нулевым. –

+0

действует, только когда линия начинается только с одного места: – Rad1

+0

@ Rad1 Что значит быть «эффективным»? Он также работает с несколькими пространствами. Для этого используется 'trim()'. – Zhedar

0

Прежде всего: оставьте DataInputStream, более специфичным для Java-объекта.

boolean started = false; 
while ... 
    if (!started) { 
     started = strLine.matches("\\s*...\\s*"); 
    } else { 
     ... 

Reg экс \\s* стенд ноль или более пробельных символов (вкладка, пробел).

1

Звучит для меня как вы должны использовать регулярные выражения (например, использовать метод String.matches()). Они также могут извлекать строки или подстроки (см.: another Stackoverflow article).

Существует также отличное введение Ларса Фогеллы о regular expressions в Java. Oracle также составил Tutorial/Lesson об этой теме.

Может быть этот фрагмент помогает немного (использует org.apache.commons.io.LineIterator):

public void grepLine(File file, String regex) 
{ 
    LineIterator it = FileUtils.lineIterator(file, "UTF-8"); 
    try 
    { 
     while (it.hasNext()) 
     { 
      String line = it.nextLine(); 
      if(line.matches(regex)) 
      { 
        //...do your stuff 
      } 
     } 
    } 
    finally 
    { 
     LineIterator.closeQuietly(it); 
    } 
} 

Регулярное выражение может быть что-то вроде (примечание: havn't проверил - особенно обратные косые):

String regex="^\\s*if\\s+\\[\\s+\\\"\\$1\\\" = \\\""+config +"\\\" \\] ; then"; 
Смежные вопросы