2013-08-01 2 views
0

мой текст , как тотчитать и писать текст и меняется только в одной колонке

SEHiR;iL;iLCE;Tip;22356 
S SI n;ISTA;ANK;A:S;22356 
K K n;IS:TA;BB;B:S;22356 
A A b;IS.TA;CC;DK;22356 
G S b;ISTA;DD;O:P;22356 

Я хочу, чтобы изменить столбец TIP. Я хочу поставить "." вместо ":" для только Tıp столбец которые включают в себя A: S, B: S и т.д .. И я хочу, чтобы линия перед изменением и после изменения в CSV писать. Как я могу это сделать? Я пишу то, но он имеет проблемы в

  1. если (eD.tip.contains (":")) часть, потому что DonT продолжают hS.Add (ЕД)
  2. endeks. put ("", hS); ı не хочу использовать строку "".
  3. Я не должен использовать HasMap я не мог написать вывод, что я хочу ..

Я ожидал, что этот выход

S SI n;ISTA;ANK;A:S;22356 
    S SI n;ISTA;ANK;A.S;22356 
    K K n;IS:TA;BB;B:S;22356 
    K K n;IS:TA;BB;B.S;22356 
    G S b;ISTA;DD;O:P;22356 
    G S b;ISTA;DD;O.P;22356 




public class MaliyeVknmDegil { 


     static class EndeksDegeri { 
      String sirket ; 
      String sehir; 
      String ilce; 
      String tip; 
      int numara; 
     } 



     static HashMap<String,HashSet<EndeksDegeri>> endeks = new HashMap<String, HashSet<EndeksDegeri>>(); 
     static PrintWriter pW; 
     static EndeksDegeri eD = new EndeksDegeri(); 
     static String satır; 
     private static PrintWriter pW2; 



      public static void main(String[] args) { 

       FileInputStream fIS; 
       FileOutputStream fOS; 
       try { 
         fIS = new FileInputStream("C:\\deneme\\DENEME.csv"); 
         Reader r = new InputStreamReader(fIS, "UTF-8"); 
         BufferedReader bR = new BufferedReader(r); 
         fOS = new FileOutputStream("c:\\yazdirilan\\deneme.csv"); 
         Writer w = new OutputStreamWriter(fOS, "UTF-8"); 
         pW2 = (new PrintWriter(w)); 

         String satır; 
         String[] eleman; 

         while ((satır = bR.readLine()) != null) {  
           eleman = satır.split(";"); 
           if(satır.contains(":")){ 
          pW2.write(satır); 
           } 

           HashSet<EndeksDegeri> hS = new HashSet<EndeksDegeri>(); 
           for (int i = 0; i < eleman.length; i++) { 
           //  alteleman=eleman[i].split("  "); 
             EndeksDegeri eD = new EndeksDegeri(); 
             eD.sirket = eleman[0]; 
             eD.sehir = eleman[1]; 
             eD.ilce = eleman[2]; 
             if(eD.tip.contains(":")){ 
              eD.tip.replaceAll(":", "."); 
              eD.tip = eleman[3]; 
             } 
             eD.numara = Integer.parseInt(eleman[4]); 
             hS.add(eD);                       
           }       
           endeks.put("", hS);       
         } 
         bR.close();  

         // yazdir 
         HashSet<EndeksDegeri> hS; 
         for (String s : endeks.keySet()) { 

           hS = endeks.get(s);   

         } 
       } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
       } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
       } catch (IOException e) { 
         e.printStackTrace(); 
       } catch (ArrayIndexOutOfBoundsException e) { 

         e.printStackTrace(); 
       } 

      }// main end 
    }// clas end 
+0

ли этот код, выполняемый без метания 'NullPointerException'? –

+0

да, потому что у него есть ошибка .. это не тот код, который имеет ошибку .. ı хотите изменить error.it дает nullpointer после if (eD.tip.contains (":")), потому что он не может добавить someting –

+0

Это дает null, потому что вы не инициализировали это поле. Вы получаете доступ к 'eD.tip', но это значение равно null. Установите его на значение _before_, обращаясь к нему –

ответ

0
package stackoverflow; 

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.Reader; 
import java.io.Writer; 

public class TipChange { 

private static String inputPath = "input.csv"; 
private static String outputPath = "output.csv"; 
private static BufferedReader bufferedReader; 
private static PrintWriter printWriter; 

public static void main(String[] args) { 
    try { 
     FileInputStream inputStream = new FileInputStream(inputPath); 
     Reader reader = new InputStreamReader(inputStream, "UTF-8"); 
     bufferedReader = new BufferedReader(reader); 

     FileOutputStream outputStream = new FileOutputStream(outputPath); 
     Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); 
     printWriter = new PrintWriter(writer); 

     String line; 

     while ((line = bufferedReader.readLine()) != null) { 
      EndeksDegeri eD = lineToClass(line); 

      if (shouldOutput(eD)) { 
       printWriter.append(classToLine(eD, true)); 
       printWriter.append(classToLine(eD, false)); 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
      bufferedReader.close(); 
      printWriter.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

private static boolean shouldOutput(EndeksDegeri eD) { 
    if (!eD.tip.contains(":")) { 
     return false; 
    } 

    return true; 
} 

private static String classToLine(EndeksDegeri eD, boolean original) { 
    if (!original) { 
     eD.tip = eD.tip.replace(":", "."); 
    } 

    return eD.sirket.concat(";") 
      .concat(eD.sehir).concat(";") 
      .concat(eD.ilce).concat(";") 
      .concat(eD.tip).concat(";") 
      .concat(String.valueOf(eD.numara) 
      .concat("\r\n")); 
} 

private static EndeksDegeri lineToClass(String line) { 
    String[] element = line.split(";"); 

    EndeksDegeri endeksDegeri = new EndeksDegeri(); 
    endeksDegeri.sirket = element[0]; 
    endeksDegeri.sehir = element[1]; 
    endeksDegeri.ilce = element[2]; 
    endeksDegeri.tip = element[3]; 
    endeksDegeri.numara = Integer.valueOf(element[4]); 

    return endeksDegeri; 
} 

private static class EndeksDegeri { 
    String sirket ; 
    String sehir; 
    String ilce; 
    String tip; 
    int numara; 
} 
} 

Пример ввода:

SSI;ISTA;ANK;A:S;22356 
KK;IS:TA;BB;B:S;22356 
AA;IS.TA;CC;DK;22356 
GS;ISTA;DD;O:P;22356 

Сгенерированный выход:

SSI;ISTA;ANK;A:S;22356 
SSI;ISTA;ANK;A.S;22356 
KK;IS:TA;BB;B:S;22356 
KK;IS:TA;BB;B.S;22356 
GS;ISTA;DD;O:P;22356 
GS;ISTA;DD;O.P;22356 
+0

Ваш текст находится на столе? –

+0

Вам нужно будет обновить inputPath и outputPath до местоположения ваш файл. –

+0

спасибо чувак: но ı хочу только выводить, какой символ «:» после изменения перед изменением, например, AA; IS.TA; CC; DK; 22356 DK не содержит «:», но он здесь. строка, которая не включает «:» только в столбце Tip –

0

Ваш код будет производить NullPointerException в линейке: if(eD.tip.contains(":")){

Это происходит потому, что, когда создается новый экземпляр EndeksDegeri все его поля null вы не можете назвать на пустую строку.

Проверьте пример кода ниже (он пишет в консоль, но он должен получить вы собираетесь)

static class EndeksDegeri { 
    String sirket; 
    String sehir; 
    String ilce; 
    String tip; 
    int numara; 

    // I have added this method for convenience to write to the output 
    public String toString() { 
     return sirket + ":" + sehir + ":" + ilce + ":" + tip + ":" + numara; 
    } 
} 

while ((satir = bR.readLine()) != null) { 
    eleman = satir.split(";"); 

    boolean found = false; 
    EndeksDegeri eD = new EndeksDegeri(); 

    // first set all fields to not get exception 
    eD.sirket = eleman[0]; 
    eD.sehir = eleman[1]; 
    eD.ilce = eleman[2]; 
    eD.tip = eleman[3]; 
    eD.numara = Integer.parseInt(eleman[4]); 

    // check if the line contains ":" 
    if (eD.tip.contains(":")) { 
     // If yes, write the original line first 
     System.out.println(eD.toString()); 

     // Change the record 
     eD.tip = eD.tip.replaceAll(":", "."); 
     found = true; 
    } 

    if (found) { 
     // write the corrected line now 
     System.out.println(eD.toString()); 
    } 
} 

// Will print only the lines with ":" and its correct version 
SSI:ISTA:ANK:A:S:22356 
SSI:ISTA:ANK:A.S:22356 
KK:IS:TA:BB:B:S:22356 
KK:IS:TA:BB:B.S:22356 
GS:ISTA:DD:O:P:22356 
GS:ISTA:DD:O.P:22356 
+0

, но hasSet дает ошибку egain .. как можно использовать hashSet –

+0

@ADKu вы не описали, что вам нужно «HashSet» для. Если вы хотите конвертировать строки, используйте приведенное выше код. В противном случае отредактируйте свой вопрос и опишите, что должен делать 'HashSet' –

+0

. Я пишу свою ошибку. # Положите мою строку в hashSet .. но я принимаю ошибку при этом, когда ı только для чтения. Совет cloumn. Как вы видите мои проблемы на моем вопрос –

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