2015-03-16 3 views
1

У меня есть файл CSV, который выглядит как этотCSV синтаксический и поиск в Java

"key,"id.attr.id","id.attr.id1","id.attr.id2","id.attr.id7","id.attr.arry","id.attr.arry1","id.attr.arry2","id.attr.arry5","id.attr.arry4" 
// this header goes on for around next 600 field. 

"1","0",,,"8",,,"8",,"8" 
"2","3",,,"7",,,"7",,"7" 
"3","4",,,"8",,,"8",,"8" 
"4","5",,,"7",,,"7",,"7" 
"5","4",,,"8",,,"8",,"8" 
"6","3",,,"7",,,"7",,"7" 
"7","4",,,"8",,,"8",,"8" 
"8","5",,,"7",,,"7",,"7" 
"9","3",,,"8",,,"8",,"8" 
"10","6",,,"7",,,"7",,"7" 

Сейчас я пытаюсь искать через содержание таким образом, чтобы он будет возвращать значения сказать " id.attr.id "он будет искать все соответствующие значения.

формат результата будет

"key","id.attr.id","id.attr.id7" 
    "1","0","8" 
    "2","3","7" 
    "3","4","8" 
    "4","5","7" 
    "5","4","8" 
    "6","3","7" 
    "7","4","8" 
    "8","5","7" 
    "9","3","8" 
    "10","6","7" 

, а также для «id.attr.arry»

Вот код я пытаюсь .. но бесполезно.

public void run() { 
    String csvFile = "/Users/file.csv"; 
    BufferedReader br = null; 
    String line = ""; 
    String cvsSplitBy = ","; 

    try { 

     br = new BufferedReader(new FileReader(csvFile)); 
     while ((line = br.readLine()) != null) { 

      // use comma as separator 
      String[] id = line.split(cvsSplitBy); 
      int j=0; 
      for (j:id.size()){ 
       if (id[1]=="id.attr.id"+j){ 
return true; 
        //don't know then how to check      } 
      else  { 
       int i=0; 
       }   } 

     } 

так что мой вопрос в том, как достичь этого результата?

+2

Еще лучше: используйте парсер CSV. Также в Java строки сравниваются с помощью equals(), а не ==. – m0skit0

+0

'for (j: id.size()) {' недействительный синтаксис, и, пожалуйста, отложите свой код правильно, особенно если это неясная часть. –

+0

Хотя вы приняли ответ, в котором используется Java с ручным кодированием, я все же умоляю вас использовать синтаксический анализатор качества CSV хорошего качества. Файлы CSV могут содержать комментарии, многострочные записи, встроенные внутри запятые данные, экранированные двойные кавычки и т. Д. (См. [CSV RFC] (https://tools.ietf.org/html/rfc4180)). Написание кода вручную для всех этих случаев является не только жестким, но и ненужным, учитывая, что есть хорошие решения. – manish

ответ

0

Ядро вашего требования - вам нужно построить карту поиска между столбцами, которые вы ищете, и их положение в строке. Вот какой код, который демонстрирует, как это сделать.

public List<String[]> selectColumns(String[] csvFile, String... columns) { 
    List<String[]> rows = new ArrayList<>(); 
    // Split the first row to get the column names. 
    String[] columnNames = csvFile[0].split(","); 
    // Build a map to get the column number from the name. 
    Map<String, Integer> columnNumbers = new HashMap<>(); 
    for (int i = 0; i < columnNames.length; i++) { 
     columnNumbers.put(columnNames[i], i); 
    } 
    // Put the title columns in. 
    String[] colHeaders = new String[columns.length]; 
    for (int i = 0; i < columns.length; i++) { 
     colHeaders[i] = columns[i]; 
    } 
    rows.add(colHeaders); 
    // Walk the rest of the file. 
    for (int i = 1; i < csvFile.length; i++) { 
     // Get and split the line. 
     String[] values = csvFile[i].split(","); 
     // Collect the required columns. 
     String[] row = new String[columns.length]; 
     for (int j = 0; j < columns.length; j++) { 
      // Look up the column number from the header map. 
      row[j] = values[columnNumbers.get(columns[j])]; 
     } 
     // Add the row. 
     rows.add(row); 
    } 
    return rows; 
} 

public void test() { 
    // In-line data for demonstration. 
    String[] csvFile = new String[]{ 
     "key,id.attr.id,id.attr.id1,id.attr.id2,id.attr.id7,id.attr.arry,id.attr.arry1,id.attr.arry2,id.attr.arry5,id.attr.arry4", 
     "1,0,,,8,,,8,,8", 
     "2,3,,,7,,,7,,7", 
     "3,4,,,8,,,8,,8", 
     "4,5,,,7,,,7,,7", 
     "5,4,,,8,,,8,,8", 
     "6,3,,,7,,,7,,7", 
     "7,4,,,8,,,8,,8", 
     "8,5,,,7,,,7,,7", 
     "9,3,,,8,,,8,,8", 
     "10,6,,,7,,,7,,7" 
    }; 
    List<String[]> selected = selectColumns(csvFile, "key", "id.attr.id", "id.attr.id7"); 
    for (String[] row : selected) { 
     System.out.println(Arrays.toString(row)); 
    } 

} 

печатает

[key, id.attr.id, id.attr.id7] 
[1, 0, 8] 
[2, 3, 7] 
[3, 4, 8] 
[4, 5, 7] 
[5, 4, 8] 
[6, 3, 7] 
[7, 4, 8] 
[8, 5, 7] 
[9, 3, 8] 
[10, 6, 7] 

Предложения использовать хороший анализатор CSV очень хороший один - String.split(",") очень ненадежен.

1

Использовать парсер высокого качества CSV. Я использую Apache Commons CSV, OpenCSV и Univocity.

Я могу полностью одобрить Univocity, поскольку его парсер CSV очень быстрый. Используя его, вы можете select columns.

+0

, но вы не поняли. как сравнить значения полей? – bongboy

+0

С 'java.lang.Object # equals (Object)' –

+0

, но вы можете сделать это, я хотел сказать специально, когда значения встроены в имя поля. например id.attr.id7, & id.attr.id6.sch – bongboy

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