2015-12-19 7 views
7

Dato questo ingressoaggiungere un carattere per l'ultimo valore in un elenco in JAVA

0000027788|001400000000000000000001224627|G1|||G1 
0000027789|001400000000000000000001224627|D1|||G1 
0000027790|001400000000000000000001224627|D1|||G1 
0000027790|001400000000000000000001224627|D1|||G1 
0000027791|001400000000000000000001224627|G2|||G2 
0000027792|001400000000000000000001224627|D2|||G2 
0000027793|001400000000000000000001224627|D2|||G2 
0000027794|001400000000000000000001224627|G6|||G6 

ho bisogno della terza colonna particolare dal file e trovare che è l'ultima D1 per il gruppo G1 e allo stesso modo lo scorso D2 per particolari G2. Dopo aver trovato l'ultimo valore, ho bisogno di qualcosa da aggiungere nel corrispondente rigo come "LL":

output

ho provato, ma la linea è sempre aggiunto paralleli tra D1 non solo per l'ultimo D1.

Questo è il mio codice:

package com.scb.firstreport; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
import java.util.StringTokenizer; 
public class EDWBatchProcessor { 

//static Logger log = Logger.getLogger(EDWBatchProcessor.class.getName()); 

public static void main(String[] args) throws JRException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 
    //log.debug("Hello this is a debug message"); 
    File fileDir = new File("D:\\EDWFileProcessing\\simple.txt"); 
    String line = null; 
    String[] split = null; 
    try { 
     // FileReader reads text files in the default encoding. 
     BufferedReader in = new BufferedReader(
        new InputStreamReader(
           new FileInputStream(fileDir), "UTF-8")); 

      BufferedWriter bufferedWriter = null; 
     while((line = in.readLine()) != null) { 
      //System.out.println(line); 
      split = line.split("\\|"); 

      List<String> customerList = new ArrayList<String>(); 

      if(!customerList.contains(split[1])){ 
       customerList.add(split[1]); 
       bufferedWriter = 
         new BufferedWriter(new OutputStreamWriter(
           new FileOutputStream("D:\\EDWFileProcessing\\output\\"+split[1]+".txt",true), "UTF-8")); 

       bufferedWriter.write(line); 
       bufferedWriter.newLine(); 
       bufferedWriter.close(); 

      } 
      else{ 

       bufferedWriter.write(line); 
       bufferedWriter.close(); 
      } 

     } 
     final File folder = new File("D:\\EDWFileProcessing\\output"); 
     listFilesForFolder(folder); 
     // Always close files. 
     in.close(); 

    } 
    catch(FileNotFoundException ex) { 
     System.out.println(
      "Unable to open file '");     
    } 
    catch(IOException ex) { 
     System.out.println(
      "Error reading file '" 
     );     
     // Or we could just do this: 
     // ex.printStackTrace(); 
    } 

    } 

private static void listFilesForFolder(File folder) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, JRException, IOException { 
    for (final File fileEntry : folder.listFiles()) { 
     if (fileEntry.isDirectory()) { 
      //listFilesForFolder(fileEntry); 
     } else { 
      // System.out.println(fileEntry.getName().substring(0, 30)); 
      //System.out.println(fileEntry.getAbsolutePath()); 

      File fileDir = new File(fileEntry.getAbsolutePath()); 
      String line = null; 
      String lineNew = "000000000000000000000000000000000"; 
      String[] split = null; 
      // FileReader reads text files in the default encoding. 
      BufferedReader in = new BufferedReader(
         new InputStreamReader(
            new FileInputStream(fileDir), "UTF-8")); 

       BufferedWriter bufferedWriter = null; 
       List<String> customerList = new ArrayList<String>(); 

       List<String> recTypeList = new ArrayList<String>(); 

      while((line = in.readLine()) != null) { 
       // System.out.println(line); 
       split = line.split("\\|"); 
       bufferedWriter = 
          new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream("D:\\EDWFileProcessing\\output\\simple\\"+split[1]+".txt",true), "UTF-8")); 

        System.out.println("Split2222222222========>>"+split[2]); 
        System.out.println("Split2222222222========>>"+recTypeList.contains(split[2])); 

        if(!recTypeList.contains(split[2])){ 
        recTypeList.add(split[2]); 
        bufferedWriter.newLine(); 

        bufferedWriter.write(line); 

        }else{ 
         bufferedWriter.newLine(); 
         line = line.concat("|LL"); 
         bufferedWriter.write(line); 
         System.out.println("line new....................."); 
         //bufferedWriter.newLine(); 
         //bufferedWriter.write(lineNew); 
         // bufferedWriter.newLine(); 
        } 


        //bufferedWriter.newLine(); 
        bufferedWriter.close(); 
      } 


      in.close(); 

     } 
    } 
} 

} 

Ho provato ad utilizzare la lista, ma "LL" sta ottenendo aggiunto alla fine di G2.

for (ListIterator<String> it = recTypeList.listIterator(); it.hasNext(); i++) { 

     String s1 = it.next(); 
      if(s1.equals("G2")) 
       { 

        int ind=it.previousIndex()-1; 
        String val=recTypeList.get(ind); 
        String lastop=val.concat("LL"); 
        bufferedWriter.write(lastop); 
        System.out.println(lastop); 
        System.out.println(val); 
       } 
+1

Non vedo dove nel codice stai cercando l'ultimo G1 o G2? Ovviamente per ogni G1 devi concatenare il valore | LL, quindi hai bisogno di un meccanismo per trovare l'ultimo G1. – Ehsan

+0

Ho bisogno di trovare l'ultima D1, D2 per ogni G1, G2. Ho segnato la colonna e ho cercato di trovare l'ultimo valore per la lista particolare ma non ha aiutato @ Ehsan – Anusha

+0

Ok, l'ho capito. quindi il tuo problema è trovare gli ultimi D1 e D2 per ogni G1 e G2, giusto? – Ehsan

risposta

0

Ecco come si può trovare l'ultimo D# per ogni G# e aggiungere un LL alla fine. Se sapessimo più informazioni su come si comporta il formato, sarebbe potuto essere più semplice. Ho sostituito il file leggendolo come una stringa e dividendo le righe in modo che lines sia quello che hai dopo aver finito di leggere tutte le righe.

public class Test { 

    public static void main(String[] args) { 

     String input = 
       "0000027788|001400000000000000000001224627|G1|  |   |G1\r\n" + 
       "0000027789|001400000000000000000001224627|D1|  |   |G1\r\n" + 
       "0000027790|001400000000000000000001224627|D1|  |   |G1\r\n" + 
       "0000027790|001400000000000000000001224627|D1|  |   |G1\r\n" + 
       "0000027791|001400000000000000000001224627|G2|  |   |G2\r\n" + 
       "0000027792|001400000000000000000001224627|D2|  |   |G2\r\n" + 
       "0000027793|001400000000000000000001224627|D2|  |   |G2\r\n" + 
       "0000027794|001400000000000000000001224627|G6|  |   |G6"; 

     String[] lines = input.split("\r\n"); 
     String[][] parts = new String[lines.length][]; 
     for (int i = 0; i < lines.length; i++) 
      parts[i] = lines[i].split("\\|"); 

     String currG = "G1"; 
     String lastD = ""; 
     for (int i = 1; i < lines.length; i++) { 
      if (parts[i][2].startsWith("G")) { 
       System.out.println("Last D for " + currG + " is " + lastD + " at line " + (i-1)); 
       lines[i-1] += " LL"; 
       currG = parts[i][2]; 
      } 
      else 
       lastD = parts[i][2]; 
     } 

     System.out.println(); 
     for (int i = 0; i < lines.length; i++) 
      System.out.println(lines[i]); 
    } 
} 

uscita:

Last D for G1 is D1 at line 3 
Last D for G2 is D2 at line 6 

0000027788|001400000000000000000001224627|G1|  |   |G1 
0000027789|001400000000000000000001224627|D1|  |   |G1 
0000027790|001400000000000000000001224627|D1|  |   |G1 
0000027790|001400000000000000000001224627|D1|  |   |G1 LL 
0000027791|001400000000000000000001224627|G2|  |   |G2 
0000027792|001400000000000000000001224627|D2|  |   |G2 
0000027793|001400000000000000000001224627|D2|  |   |G2 LL 
0000027794|001400000000000000000001224627|G6|  |   |G6 

mie ipotesi sono che la seconda colonna ha solo G# o D# e che nella riga 0 è G1.

Edit: Se aggiungo alle mie ipotesi di cui sopra che sotto ogni G# ci sono D s con solo lo stesso # allora questo è più breve:

public class Test { 

    public static void main(String[] args) { 

     String input = 
       "0000027788|001400000000000000000001224627|G1|  |   |G1\r\n" + 
       "0000027789|001400000000000000000001224627|D1|  |   |G1\r\n" + 
       "0000027790|001400000000000000000001224627|D1|  |   |G1\r\n" + 
       "0000027790|001400000000000000000001224627|D1|  |   |G1\r\n" + 
       "0000027791|001400000000000000000001224627|G2|  |   |G2\r\n" + 
       "0000027792|001400000000000000000001224627|D2|  |   |G2\r\n" + 
       "0000027793|001400000000000000000001224627|D2|  |   |G2\r\n" + 
       "0000027794|001400000000000000000001224627|G6|  |   |G6"; 

     String[] lines = input.split("\r\n"); 
     String[][] parts = new String[lines.length][]; 
     for (int i = 0; i < lines.length; i++) 
      parts[i] = lines[i].split("\\|"); 

     String currG = "G1"; 
     for (int i = 1; i < lines.length; i++) { 
      if (parts[i][2].startsWith("G")) { 
       System.out.println("Last D" + parts[i-1][2].substring(1) + " for " + currG + " is at line " + (i-1)); 
       lines[i-1] += " LL"; 
       currG = parts[i][2]; 
      } 
     } 

     System.out.println(); 
     for (int i = 0; i < lines.length; i++) 
      System.out.println(lines[i]); 
    } 
} 

Edit2: con la lettura di file e la scrittura

public class Test { 

    public static void main(String[] args) { 

     String input = "path\\to\\input\\text.txt"; 
     String output = "path\\to\\output\\text.txt"; 
     BufferedReader in; 
     BufferedWriter out; 
     try { 
      in = new BufferedReader(new InputStreamReader(new FileInputStream(input), "UTF-8")); 
      out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output, true), "UTF-8")); 

      String line, lastLine; 
      lastLine = in.readLine(); 
      while ((line = in.readLine()) != null) { 
       String[] parts = line.split("\\|"); 
       if (parts[2].startsWith("G")) { 
        lastLine += " LL"; 
       } 
       out.write(lastLine); 
       out.write(System.lineSeparator()); 
       lastLine = line; 
      } 
      out.write(lastLine); 

      in.close(); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Gestire correttamente le eccezioni.

Ecco come funziona:

lastLine mantiene la linea precedente leggere mentre line viene cercato un nuovo G. Se viene trovato uno, quindi lastLine deve contenere l'ultimo D dello precedenteG. Ecco le prime iterazioni:

lastLine: G1 0 
line:  D1 1 
--- 
lastLine: D1 1 
line:  D1 2 
--- 
lastLine: D1 2 
line:  D1 3 
--- 
lastLine: D1 3 
line:  G2 4 
// line starts with G, so append LL to lastLine because it's the last D for G1. 
--- 
lastLine: G2 4 
line:  D2 5 
... 
+0

Grazie, ma l'input deve essere letto utilizzando il lettore di file e scritto utilizzando il file writer ed è difficile dare l'input in codice perché l'input ha più di 30000 righe. Quindi la lettura dei file sarà efficiente @ user1803551 – Anusha

+0

@Anusha La tua domanda non è su come leggere e scrivere un file, ma su come analizzarlo e modificarlo. L'algoritmo è lo stesso. Leggi ogni riga e anch'io. Basta applicare l'algoritmo alle tue linee. Lo stesso per scrivere i file, basta eseguire l'output su un file anziché sulla console. – user1803551

+0

@Anusha Durante la lettura del file è sufficiente tenere le linee 'i' e' i-1'. Noterai che i miei loop guardano solo questi 2. Non è necessario leggere le 30000 linee contemporaneamente. – user1803551

-1

Prima di tutto, è necessario eseguire due passaggi sul file; uno per determinare dove ogni riga Ultima per ogni GX è, e quindi per aggiungere il LL lì. Tuttavia, penso che se sapessimo qual è il tuo processo e perché dovresti metterlo lì, potremmo essere in grado di aiutare di più.

+0

Non penso che siano necessari 2 passaggi, nella mia risposta lo faccio con 1. – user1803551

+0

Vedo due passaggi nella risposta, @ user1803551. Il primo passaggio stampa i numeri di riga. Il secondo passaggio stampa le linee. –

+0

È solo per renderlo più chiaro per l'OP. Potrei mettere la stampa nel primo ciclo. Inoltre, si desideravano 2 cicli per 'determinare dove ogni riga Ultima per ogni GX è' e' aggiungere il LL lì'. Questi due sono fatti in un ciclo indipendentemente dalla stampa. – user1803551

-1

Non è necessario mantenere un elenco di righe: ciò potrebbe essere significativo se si elaborano file di grandi dimensioni.Quello di cui hai bisogno è di memorizzare la riga precedente mentre stai leggendo il file e scriverlo "una riga dietro".

È possibile rimuovere customerList (che non si sta usando in ogni caso) e recTypeList da findFilesForFolder, e basta aggiungere una singola stringa.

ho preso parti del codice e ha aggiunto alcune delle mie proprie linee per mostrare quello che voglio dire:

 String previousLine = null; 
     String[] previousSplit = null; 
     while((line = in.readLine()) != null) { 
      split = line.split("\\|"); 

      // ... 

      if (previousLine != null) { 
       bufferedWriter.write(previousLine); 
       if (!previousSplit[2].equals(split[2])) { 
        bufferedWriter.write("LL"); 
       } 
       bufferedWriter.newLine(); 

       // ... 

      } 
      previousLine = line; 
      previousSplit = split; 
     } 
     bufferedWriter.write(previousLine); 
     bufferedWriter.write("LL"); 
     bufferedWriter.newLine(); 

(Il codice di cui sopra solo illustra la tecnica, si dovrà aggiungere un po 'di più di elaborazione per il proprio codice per controllare l'ultima colonna - il gruppo - e fare quanto sopra in modo indipendente per ciascun gruppo)

0

Se il file di input è ordinato per colonne G e D si può fare in un solo passaggio:

public void processSorted() throws Exception { 
    reset(); 

    previousG = null; 

    while (next()) { 
     finishLastLine(); 
     out.print(line); 
     previousDep = values[2]; 
     previousG = group(); 
    } 

    finishLastLine(); 
} 

private void finishLastLine() { 
    if (previousG != null && previousDep != null) { 
     if (!group().equals(previousG) || !dep().equals(previousDep)) { 
      if (previousG.equals("G1") && previousDep.equals("D1")) { 
       out.print("|LL"); 
      } else if (previousG.equals("G2") && previousDep.equals("D2")) { 
       out.print("|LL"); 
      } 
     } 
     out.println(); 
    } 
} 
.

Se non è ordinato, è necessario prima trovare gli ultimi record per D1 e D2 (è necessario raggiungere la fine per dirlo), quindi leggere l'input ancora una volta per scrivere il file di output (a meno che non venga detto che il tempo di elaborazione è importante e ci sarà sempre memoria sufficiente per gestire l'ingresso):

public void scanUnsorted() throws Exception { 
    reset(); 
    while (next()) { 
     switch (group()) { 
      case "G1": 
       if (dep().equals("D1")) 
        lastD1 = index; 
       break; 
      case "G2": 
       if (dep().equals("D2")) 
        lastD2 = index; 
       break; 
     } 
    } 
} 

public void write() throws Exception { 
    reset(); 
    while (next()) { 
     out.print(line); 
     if (lastD1 >= 0 && index == lastD1 
     || lastD2 >= 0 && index == lastD2 
     ) { 
      out.print("|LL"); 
     } 
     out.println(); 
    } 
    out.flush(); 
} 

Ecco the full runnable gist con casi di test.

Problemi correlati