2017-05-26 10 views
0

hier in meinem Dateiinhalt 2017-05-05 08:24:46 bis 2017-05-05 08:24:55, jetzt muss ich von 2017-05 drucken -05 08:24:49 bis -2017-05-05 08:24:52 Inhalt zwischen dem Datum. Können Sie eine andere Methode als diese vorschlagen?Wie bekomme ich eine bestimmte Zeichenfolge in einer Datei

1.file Inhalt:

[2017-05-05 08:24:46]contents is [ [pool-80 
thread.PaseInterceptorChain... zhjkhzjh]nkshxkjghsjkgjskgxsjgxjsagxhujgsxhjsxghjvasxhasvxhjvsaxhvshjxvhjvhxjvhsvxhj 
[2017-05-05 08:24:49]contents is [ [pool-80-thread-1] xhggajgzjh 
icationExceptionOutInterceptor... nvsjhkslkxlxskl]jsahxjahx 
[2017-05-05 08:24:49]contents is [ [pool-78-thread-1.. ] 
[2017-05-05 08:24:52]contents is [ [pool-78-thread-1... ] 
[2017-05-05 08:24:52]contents is [ [pool-78-thread-1... {... = 
contents inside}] 
[2017-05-05 08:24:55]contents is [ [pool-78-thread-1... {... = 
contents inside}] 

2.this ist mein Code:

public class MeteringlogBean implements Serializable 
{ 
private static final long serialVersionUID = 1L; 
private Date date10; 
private Date date11; 
private String d; 
private String d1; 
private String s; 
private String text; 
private FileWriter fw; 
private BufferedWriter bw; 
private String Fn = "C:/Users/swetha.papireddy/Documents/new/filename.txt"; 
public Date getDate11() { 
return date11; 
} 
public void setDate11(Date date11) { 
this.date11 = date11; 
} 
private String environment; 
public String getEnvironment() { 
return environment; 
} 
public void setEnvironment(String environment) { 
this.environment = environment; 
} 
public Date getDate10() { 
return date10; 
} 
public void setDate10(Date date10) { 
this.date10 = date10; 
} 

public void save() throws IOException, NullPointerException { 
try { 
    File file = new File(getEnvironment() + "/ischange.log"); 
    FileReader fileReader = new FileReader(file); 
    BufferedReader bufferedReader = new BufferedReader(fileReader); 
    StringBuilder stringBuilder = new StringBuilder(); 
    String line; 
    while ((line = bufferedReader.readLine()) != null) { 
     stringBuilder.append(line); 
     stringBuilder.append("\n"); 
    } 
    fileReader.close(); 
    System.out.println("Contents of file:"); 
    s = stringBuilder.toString(); 
    System.out.println(s); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date10); 
System.out.println("date:-" + d); 
d1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date11); 
System.out.println("date:-" + d1); 

fw = new FileWriter(Fn); 
bw = new BufferedWriter(fw); 
bw.write(s); 
bw.close(); 

File file = new File(Fn); 
FileInputStream fis = new FileInputStream(file); 
byte[] bytes = new byte[(int) file.length()]; 
fis.read(bytes); 
fis.close(); 

String text = new String(bytes, "UTF-8"); 
String str1 = new String(d); 
String str2 = new String(d1); 
System.out.println(text.substring(text.indexOf(str1), 
     text.lastIndexOf(str2))); 
} 

3.my tatsächliche Ausgabe ist:

[2017-05-05 08:24:49]contents is [ [pool-80-thread-1] xhggajgzjh 
icationExceptionOutInterceptor... nvsjhkslkxlxskl]jsahxjahx 
[2017-05-05 08:24:49]contents is [ [pool-78-thread-1.. ] 
[2017-05-05 08:24:52]contents is [ [pool-78-thread-1... ] 

jetzt ich zwei bekommen müssen [2017-05-05 08:24:52]

4.outpu t sollte sein:

[2017-05-05 08:24:49]contents is [ [pool-80-thread-1] xhggajgzjh 
icationExceptionOutInterceptor... nvsjhkslkxlxskl]jsahxjahx 
[2017-05-05 08:24:49]contents is [ [pool-78-thread-1.. ] 
[2017-05-05 08:24:52]contents is [ [pool-78-thread-1... ] 
[2017-05-05 08:24:52]contents is [ [pool-78-thread-1... {... = 
contents inside}] 
+0

Formatieren Sie den Beispielcode richtig und verwenden Sie sinnvolle Variablennamen. Wie es ist, ist dieser Code zu schwer zu lesen. –

+0

Haben Sie zwei Booleans, die anzeigen, wenn die erste gefundene Zeichenfolge und die zweite gefundene Zeichenfolge 'wenn firsStringFound && secondStringFound && dateString nicht gleich secondString ist, dann break' –

Antwort

2

können Sie verwenden String.contains (Ihre Suche String) oder String.endsWith() oder String.StartsWith() oder eine Logik etwas verwenden, wie

while((currentLine = scanner.readLine()) != null) 
{ 
    if(currentLine.indexOf("Your String")) 
    { 
     //Do task 
     passedLine = true; 
    } 
    if(passedLine) 
    { 
     //Do other task after passing the line. 
    } 
    lineNumber++; 
} 
+0

wo diese verwenden? – Swetha

0

Versuchen Sie, Fügen Sie die Logik hinzu, um den nächsten Datetime-Wert zu erhalten, und verwenden Sie sie, um den vorherigen Wert zu erhalten.

Beispiel: derzeit erhalten Sie die Protokolle bis [2017-05-05 08:24:52]. Bevor Sie den letzten Index dieses Strings angeben, versuchen Sie, den nächsten unmittelbaren Datetime-Wert nach "[2017-05-05 08:24:52]" zu identifizieren. Verwenden Sie String.contains, um es zu erhalten.

Login in die letzte Zeile zu erhalten:

Current datetime = "2017-05-05 08:24:52"; 
boolean nextValueFound; 
while(!nextValueFound){ 
Date newDate = calender.add(Date, 1); // this will add seconds (not exactly. please check) 
//convert the date to String 
dateStringtobeCheckedinText = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date11); 
if(text.contains(dateStringtobeCheckedinText)){ 
    nextValueFound = true; 
} 
} 

// your required text: 
System.out.println(text.substring(text.indexOf(str1), 
     text.indexOf(dateStringtobeCheckedinText))); 
+0

aber hier gebe ich nicht spezifisches aktuelles datetime, ich kann irgendein Datum auswählen. datum10 ist für von datum und datum11 ist für bis datum – Swetha

+0

können sie bitte mehr erklären .. im nicht bekommen urpunkt – Swetha

+0

müssen sie suchen für anfang des datum10 bis ende des datums 11 zeile. Da Sie versuchen, als Teilzeichenfolge zu erhalten, müssen Sie zwischen dem ersten Vorkommen von date10 --- bis --- dem ersten Vorkommen des Datumswertes neben date11 suchen, das in der von Ihnen gesuchten Zeichenfolge vorhanden ist. Also, bevor substring anwenden, holen Sie den nächsten Datum Wert im Protokoll (StringText) –

0

die Datei lesen und speichert das Ergebnis in String-Builder.

public static String getInputString(String filepath) throws IOException { 
     RandomAccessFile randomAccessFile = new RandomAccessFile 
       (filepath, "r"); 
     FileChannel channel = randomAccessFile.getChannel(); 
     ByteBuffer buffer = ByteBuffer.allocate(1024);  //Reading the file in chunk of 1024 bytes[1KB] 
     StringBuilder sb = new StringBuilder(""); 
     while(channel.read(buffer) > 0) 
     { 
      buffer.flip();         //Ready for get ,put operation 
      for (int i = 0; i < buffer.limit(); i++) 
      { 
       sb.append((char)buffer.get());    //Reading every character and appending to Stringbuilder    
      } 
      buffer.clear(); 
     }   
     channel.close(); 
     randomAccessFile.close(); 
     return sb.toString(); 
    } 

Verwenden regex den Protokolltext zwischen Datum finden ::

private HashMap<String, List<String>> parsedMap = new HashMap<String, List<String>>(); 
public HashMap<String, List<String>> getValues(String inputSTring) { 
     String regex = "(?=((("Start Date")(.*?|\n.*?)("End Date"))))"; 

     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(inputSTring); 

     while(matcher.find()) { 
      String key = matcher.group(3); 
      String value = matcher.group(4);    

      System.out.println(key + " => " + value); 
      List<String>contentsList = parsedMap.get(key); 
      if(contentsList == null) { 
       contentsList = new ArrayList<String>(); 
       parsedMap.put(key, contentsList); 
      } 
      contentsList.add(value); 
     } 
     return parsedMap;  
    } 

dann den Wert von HashmMap holen und neue Ausgabe String erstellen.

+0

es funktioniert nicht für mich .. können Sie eine andere Methode geben – Swetha

+0

Sie müssen Ihren Code entsprechend ändern. – Vaibs

+0

können Sie sagen, wo Sie das richtig verwenden? – Swetha

Verwandte Themen