2012-03-01 23 views
3

CSV(またはXLS)ファイルをJSONオブジェクトに変換するオープンソースのJavaライブラリがありますか?私はjson.cdl(http://bethecoder.com/applications/tutorials/json/json-java/csv-to-jsonarray.html)を使ってみましたが、どうにかして大きなCSS文字列では動作しないようです。私はhttp://www.cparker15.com/code/utilities/csv-to-json/のようなものを見つけようとしていますが、javaで書かれています。どんな助けもありがとうございます。ありがとう!CSVファイルをJavaのJSONオブジェクトに変換する

+2

特に、Javaソリューションを求めるので、おそらく_exact_重複はありません。 – DNA

答えて

2

あなたのCSVが単純な場合、これは手で書きやすいです - しかし、CSVは、欠損値を、引用して厄介なエッジケースを含めることができ、など

  • ファイルをロードするBufferedReader.readLine()
  • String.split(",")を使用して各行から値を取得する - このアプローチはworあなたの値にカンマがない場合は、正しくkを入力してください。
  • は引用BufferedWriter
      必要なJSON括弧付き
    • とを使用して出力し、各値を書き込む

あなたは、その後、CSVライブラリを使用

の手によって「JSONに変換したい場合があります
2

@Mouscellaneousは基本的にあなたのためにこれに答えましたので、彼に信用を与えてください。私は依存関係を含めるためにMavenを使用していますが、また、それらを手動でダウンロードして、あなたのクラスパスに含めることができ

package edu.apollogrp.csvtojson; 

import au.com.bytecode.opencsv.bean.CsvToBean; 
import au.com.bytecode.opencsv.bean.HeaderColumnNameMappingStrategy; 
import org.codehaus.jackson.map.ObjectMapper; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.List; 

public class ConvertCsvToJson { 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     if (args.length > 1) { 
      String pathToCsvFile = args[0]; 
      String javaBeanClassName = "edu.apollogrp.csvtojson.bean." + args[1]; 
      final File file = new File(pathToCsvFile); 
      if (!file.exists()) { 
       System.out.println("The file you specified does not exist. path=" + pathToCsvFile); 
      } 
      Class<?> type = null; 
      try { 
       type = Class.forName(javaBeanClassName); 
      } catch (ClassNotFoundException e) { 
       System.out.println("The java bean you specified does not exist. className=" + javaBeanClassName); 
      } 

      HeaderColumnNameMappingStrategy strat = new HeaderColumnNameMappingStrategy(); 
      strat.setType(type); 

      CsvToBean csv = new CsvToBean(); 
      List list = csv.parse(strat, new InputStreamReader(new FileInputStream(file))); 
      System.out.println(new ObjectMapper().writeValueAsString(list)); 
     } else { 
      System.out.println("Please specify the path to the csv file."); 
     } 
    } 
} 

:ここ

は私が思いついたものです。

<dependency> 
    <groupId>net.sf.opencsv</groupId> 
    <artifactId>opencsv</artifactId> 
    <version>2.0</version> 
</dependency> 

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.9.12</version> 
</dependency> 
<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-asl</artifactId> 
    <version>1.9.12</version> 
</dependency> 
1

私はcode.youは、CSVを使用することができ、この中でExcelファイルを使用していました。 私はこのクラスを私に知られている特定のExcel/csv形式用に書いています。

import java.io.File; 

public class ReadExcel { 

    private String inputFile; 

    public void setInputFile(String inputFile) { 
     this.inputFile = inputFile; 
    } 

    public void read() throws IOException { 
     File inputWorkbook = new File(inputFile); 
     Workbook w; 
     try { 
      w = Workbook.getWorkbook(inputWorkbook); 
      // Get the first sheet 
      Sheet sheet = w.getSheet(0); 
      // Loop over first 10 column and lines 
      int columns = sheet.getColumns(); 
      int rows = sheet.getRows(); 
      ContactList clist = new ContactList(); 
      ArrayList<Contact> contacts = new ArrayList<Contact>(); 
      for (int j = 1; j < rows; j++) { 
       Contact contact = new Contact(); 
       for (int i = 0; i < columns; i++) { 
        Cell cell = sheet.getCell(i, j); 

        switch (i) { 
        case 0: 
         if (!cell.getContents().equalsIgnoreCase("")) { 
          contact.setSrNo(Integer.parseInt(cell.getContents())); 
         } else { 
          contact.setSrNo(j); 
         } 

         break; 
        case 1: 
         contact.setName(cell.getContents()); 
         break; 
        case 2: 
         contact.setAddress(cell.getContents()); 
         break; 
        case 3: 
         contact.setCity(cell.getContents()); 
         break; 
        case 4: 
         contact.setContactNo(cell.getContents()); 
         break; 
        case 5: 
         contact.setCategory(cell.getContents()); 
         break; 
        } 

       } 
       contacts.add(contact); 

      } 
      System.out.println("done"); 
      clist.setContactList(contacts); 
      JSONObject jsonlist = new JSONObject(clist); 
      File f = new File("/home/vishal/Downloads/database.txt"); 
      FileOutputStream fos = new FileOutputStream(f, true); 
      PrintStream ps = new PrintStream(fos); 

      ps.append(jsonlist.toString()); 

     } catch (BiffException e) { 
      e.printStackTrace(); 
      System.out.println("error"); 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     ReadExcel test = new ReadExcel(); 
     test.setInputFile("/home/vishal/Downloads/database.xls"); 
     test.read(); 
    } 
} 

私はここ

+0

'Workbook'、' Sheet'と 'ContactList'クラスは何ですか? –

+0

jxl.jarファイルをインポートしたときにこのクラスの説明がわかりません。このライブラリからクラスを取得しました。あなたがしたい場合は、私は後の詳細について説明します。ありがとう –

4

を読み込むExcelのjxl.jarを使用していた私のJavaプログラムであり、誰かが重宝願っています。

「SYMBOL、DATE、CLOSE_PRICE、OPEN_PRICE、HIGH_PRICE、LOW_PRICE、VOLUME、ADJ_CLOSE

のAaIT、2015年2月26日00:00:00.000、-35.152

フォーマットは次のようにする必要があります、0,35.152,35.12,679,0

AAL、2015年2月26日00:00:00.000,49.35,50.38,50.38,49.02,7572135,0"

最初の行は列ヘッダです。どこでも引用符はありません。セミコロンではなくコンマで区切ります。あなたは契約を結ぶ。

/* Summary: Converts a CSV file to a JSON file.*/ 

//import java.util.*; 
import java.io.*; 

import javax.swing.*; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class CSVtoJSON extends JFrame{ 
    private static final long serialVersionUID = 1L; 
    private static File CSVFile; 
    private static BufferedReader read; 
    private static BufferedWriter write; 

    public CSVtoJSON(){ 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("comma separated values", "csv"); 
     JFileChooser choice = new JFileChooser(); 
     choice.setFileFilter(filter); //limit the files displayed 

     int option = choice.showOpenDialog(this); 
     if (option == JFileChooser.APPROVE_OPTION) { 
      CSVFile = choice.getSelectedFile(); 
     } 
     else{ 
      JOptionPane.showMessageDialog(this, "Did not select file. Program will exit.", "System Dialog", JOptionPane.PLAIN_MESSAGE);   
      System.exit(1); 
     } 
    } 

    public static void main(String args[]){ 
     CSVtoJSON parse = new CSVtoJSON(); 
     parse.convert(); 

     System.exit(0); 
    } 

    private void convert(){ 
     /*Converts a .csv file to .json. Assumes first line is header with columns*/ 
     try { 
      read = new BufferedReader(new FileReader(CSVFile)); 

      String outputName = CSVFile.toString().substring(0, 
        CSVFile.toString().lastIndexOf(".")) + ".json"; 
      write = new BufferedWriter(new FileWriter(new File(outputName))); 

      String line; 
      String columns[]; //contains column names 
      int num_cols; 
      String tokens[]; 

      int progress = 0; //check progress 

      //initialize columns 
      line = read.readLine(); 
      columns = line.split(","); 
      num_cols = columns.length; 


      write.write("["); //begin file as array 
      line = read.readLine(); 


      while(true) { 
       tokens = line.split(","); 

       if (tokens.length == num_cols){ //if number columns equal to number entries 
        write.write("{"); 

        for (int k = 0; k < num_cols; ++k){ //for each column 
         if (tokens[k].matches("^-?[0-9]*\\.?[0-9]*$")){ //if a number 
          write.write("\"" + columns[k] + "\": " + tokens[k]); 
          if (k < num_cols - 1) write.write(", ");            } 
         else { //if a string 
          write.write("\"" + columns[k] + "\": \"" + tokens[k] + "\""); 
          if (k < num_cols - 1) write.write(", "); 
         } 
        } 

        ++progress; //progress update 
        if (progress % 10000 == 0) System.out.println(progress); //print progress   


        if((line = read.readLine()) != null){//if not last line 
         write.write("},"); 
         write.newLine(); 
        } 
        else{ 
         write.write("}]");//if last line 
         write.newLine(); 
         break; 
        } 
       } 
       else{ 
        //line = read.readLine(); //read next line if wish to continue parsing despite error 
        JOptionPane.showMessageDialog(this, "ERROR: Formatting error line " + (progress + 2) 
        + ". Failed to parse.", 
          "System Dialog", JOptionPane.PLAIN_MESSAGE);      
        System.exit(-1); //error message 
       } 
      } 

      JOptionPane.showMessageDialog(this, "File converted successfully to "  + outputName, 
        "System Dialog", JOptionPane.PLAIN_MESSAGE); 

      write.close(); 
      read.close(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
    } 
    } 

は、Swingが必要ですが、知っている人は全くJavaが一度実行の.jarにパッケージ化に使用することはできませんので、気の利いた小さなGUIが付属しています。自由にそれを改善してください。これらの年を助けてくれてありがとうStackOverflowありがとう。

0

Java 8を使用している場合は、次のようにすることができます。ライブラリや複雑なロジックは必要ありません。

まず、新しいJSONオブジェクトを表すPOJOを作成します。私の例では、それは 'YourJSONObject'と呼ばれ、2つの文字列を取るコンストラクタを持っています。

コードは最初にファイルを読み込み、文字列ベースの行のストリームを作成します。 (1行はCSVファイルの1行に相当します)。

次に、マップ関数にラインを渡します。マップ関数は、コンマで区切ってYourJSONObjectを作成します。

これらのオブジェクトはすべて、JSONArrayコンストラクタに渡されるリストに集められます。

これで、JSONObjectの配列が作成されました。このテキスト表現を見たい場合は、このオブジェクトのtoString()を呼び出すことができます。

 JSONArray objects = new JSONArray(Files.readAllLines(Paths.get("src/main/resources/your_csv_file.csv")) 
      .stream() 
      .map(s -> new YourJSONObject(s.split(",")[0], s.split(",")[1])) 
      .collect(toList())); 
-1

私は自分の解決策を共有すると思っていましたが、引用符は、値のカンマの前後で使用されているものとします。その後、すべての見積もりも削除されます。

このメソッドは、CSV形式の文字列を受け入れます。したがって、あなたはすでにCSVファイルを文字列に読み込んだと仮定します。読み込み中にNextLine文字( '\ n')を削除していないことを確認してください。

この方法は決して完璧ではありませんが、あなたが探している純粋なJavaのクイックワンメソッドソリューションかもしれません。

public String CSVtoJSON(String output) { 

    String[] lines = output.split("\n"); 

    StringBuilder builder = new StringBuilder(); 
    builder.append('['); 
    String[] headers = new String[0]; 

    //CSV TO JSON 
    for (int i = 0; i < lines.length; i++) { 
     String[] values = lines[i].replaceAll("\"", "").split("۞"); 

     if (i == 0) //INDEX LIST 
     { 
      headers = values; 
     } else { 
      builder.append('{'); 
      for (int j = 0; j < values.length && j < headers.length; j++) { 

       String jsonvalue = "\"" + headers[j] + "\":\"" + values[j] + "\""; 
       if (j != values.length - 1) { //if not last value of values... 
        jsonvalue += ','; 
       } 
       builder.append(jsonvalue); 
      } 
      builder.append('}'); 
      if (i != lines.length - 1) { 
       builder.append(','); 
      } 
     } 
    } 
    builder.append(']'); 
    output = builder.toString(); 

    return output; 
} 
関連する問題