2016-03-22 22 views
2

Düzensiz csv dosyalarını yazdırabilen ve değiştirebilen bir program yazmak istedim. aşağıdaki gibiJava'da karmaşık csv dosyalarını değiştirme

1.date 
    2.organization name 
    3. student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
    1.another date 
    2.another organization name 
    3. student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
     .......... 

Örneğin, veri verilebilir: Format şöyle

1. 10/09/2016 
2. cycling club 
3. sam, 1000, oklahoma 
    henry, 1001, california 
    bill, 1002, NY 
1. 11/15/2016 
2. swimming club 
3. jane, 9001, georgia 
    elizabeth, 9002, lousiana 

Ben bir acemi ve ben bu tür uğraşan herhangi yaşayabilir kaynağını çevrimiçi bulamadı sorun. Benim asıl kaygım şu ki, döngü boyunca nasıl yineliyoruz ve kulübün tarihini ve ismini nasıl belirliyoruz ve onları bir dizi halinde besliyoruz? Lütfen bunu önerin.

+0

mi var Bu ikinci kod alanı bir örnek şema veya bir örnek dosya? Bir CSV dosyası gibi görünmüyor. –

+1

Aslında bu çok zor değil: satır satır okumak için bir tarayıcı kullanıyorsunuz; Bir veriyi taşıması gerekenler SimpleDateFormatter kullanılarak ayrıştırılabilir; sonraki satır ... sadece dizeyi saklarsınız ve bir sonraki satırda, bir CSV ayrıştırıcısına beslenirsiniz (sadece bu terim için google; bununla yardımcı olacak bol miktarda kütüphaneye neden olur). – GhostCat

cevap

1

Bunun sizin için yararlı olacağını düşünüyorum. Temelde dağınık csv'de bir örnek olmalı. Aşağıda CSV

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { 

     PrintWriter writer = new PrintWriter("file.txt", "UTF-8"); 
      try{ 

       //Create object of FileReader 
       FileReader inputFile = new FileReader("csv.txt"); 

       //Instantiate the BufferedReader Class 
       BufferedReader bufferReader = new BufferedReader(inputFile); 

       //Variable to hold the one line data 
       String line; 
       String date="";String org ="";String student =""; 
       // Read file line by line and print on the console 
       while ((line = bufferReader.readLine()) != null) { 
        if(line.contains("1.")){ 
         if(date!="" || org!=""){ 
          writer.println(date+","+org+","+student); 
          student =""; 
         } 
         date = line.substring(2); 
         }else if(line.contains("2.")){ 
          org = line.substring(2); 

         }else{ 
          line = "("+line+")"; 
          student += line+","; 
        } 

        System.out.println(line); 
       } 
       writer.println(date+","+org+","+student); 
       //Close the buffer reader 
       bufferReader.close(); 
     }catch(Exception e){ 
     System.out.println("Error while reading file line by line:" + e.getMessage());      
    } 
     writer.close(); 
    } 

Bu ben csv.txt dosyayı okuyorum bu

10/09/2016, cycling club,(3. sam, 1000, oklahoma),( henry, 1001, california),( bill, 1002, NY), 
    11/15/2016, swimming club,(3. jane, 9001, georgia),( elizabeth, 9002, lousiana), 

için alacak çıkışı düzenlemek için benim koddur. döngü, metin dosyasının her satırından geçerken. tüm alanlar bir değişkende saklanır. Bir sonraki tarih geldiğinde hepsini çıktı dosyasına yazarım. While döngüsünün sona ermesinden sonra csv'nin son satırı dosyaya yazılır.

+1

Girişiniz için çok teşekkür ederim. Kodunuz çok net ve anlaşılması kolay. Bu bana çok yardımcı oldu. –

+0

Bir şey değil. – denis

1

bu işlemek için uniVocity-parsers deneyin. Bu tür bir formatı ayrıştırmak için birkaç örnek here bulacaksınız. Yazmak için here ve here'a bakın. Ben verdiğim örneklerden adapte

, yazabilirsiniz:

final ObjectRowListProcessor dateProcessor = new ObjectRowListProcessor(); 
final ObjectRowListProcessor clubProcessor = new ObjectRowListProcessor(); 
final ObjectRowListProcessor memberProcessor = new ObjectRowListProcessor(); 

InputValueSwitch switch = new InputValueSwitch(0){ 
    public void rowProcessorSwitched(RowProcessor from, RowProcessor to) { 
    //your custom logic here 
    if (to == dateProcessor) { 
     //processing dates. 
    } 
    if (to == clubProcessor) { 
     //processing clubs. 
    } 
    if (to == memberProcessor){ 
     //processing members 
    } 
}; 

switch.addSwitchForValue("1.", dateProcessor, 1); //getting values of column 1 and sending them to `dateProcessor` 
switch.addSwitchForValue("2.", clubProcessor, 1); //getting values of column 1 and sending them to `clubProcessor` 
switch.addSwitchForValue("3.", memberProcessor, 1, 2, 3); //getting values of columns 1, 2, and 3 and sending them to `memberProcessor` 
setDefaultSwitch(memberProcessor, 1, 2, 3); //Rows with blank value at column 0 are members. Also get columns 1, 2, and 3 and send them to `memberProcessor` 

CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial and examples 

// configure the parser to use the switch 
settings.setRowProcessor(switch); 

//creates a parser 
CsvParser parser = new CsvParser(settings); 

//parse everying. Rows will be sent to the RowProcessor of each switch, depending on the value at column 0. 
parser.parse(new File("/path/to/file.csv")); 

Destek Bu kütüphanenin yazarı değilim, o açık kaynak ve ücretsiz (Apache 2.0 lisansı)

İlgili konular