2015-07-16 4 views
-3

Мне нужно собрать данные CSV с group by в Java.Совокупные данные CSV с группой по Java

Мой файл CSV выглядит следующим образом:

Numero, NumeroWsn, NoeudAdress, PacketRece, NoeudsRece, Hello 
1436136640477044,wsn430-8,NA:b27b,Packet recevied from,RX: b0b4, Hello #33 
1436136640477257,wsn430-8,NA:b27b,Packet recevied from,RX: b986, Hello #33 
1436136640477415,wsn430-8,NA:b27b,Packet recevied from,RX: bc2d, Hello #33 
1436136640477566,wsn430-8,NA:b27b,Packet recevied from,RX: b36b, Hello #34 
1436136640477716,wsn430-8,NA:b27b,Packet recevied from,RX: bcb6, Hello #35 
1436136640477995,wsn430-9,NA:bc2d,Packet recevied from,RX: 1f9e, Hello #33 
1436136640478162,wsn430-9,NA:bc2d,Packet recevied from,RX: be29, Hello #33 
1436136640478313,wsn430-9,NA:bc2d,Packet recevied from,RX: b61a, Hello #32 
1436136640478462,wsn430-9,NA:bc2d,Packet recevied from,RX: c735, Hello #32 
1436136640478612,wsn430-9,NA:bc2d,Packet recevied from,RX: bb0a, Hello #32 
1436136640478760,wsn430-9,NA:bc2d,Packet recevied from,RX: b6bc, Hello #33 
1436136640477044,wsn430-8,NA:b27b,Packet recevied from,RX: b0b1, Hello #42 
1436136640477257,wsn430-8,NA:b27b,Packet recevied from,RX: b984, Hello #44 

Есть ли способ объединить эти данные, группируя по NoeudAdress и показывают NoeudsRece счетчиков в колонке, как показано ниже, с помощью Java?

NoeudsAdresse,NumberOfNoeudsRece 

b27b ,7 
bc2d ,6 

Я думал о загрузке CSV-файла в список с помощью OpenCSV, но это эффективным для CSV-файла с миллионами строк?

+1

Если не-Java-решения в порядке, это можно сделать в командной строке следующим образом: cat FileWithData | awk -F, '{print $ 3}' | awk -F: '{print $ 2}' | сортировать | uniq -c –

ответ

0

Использовать H2 вместо OpenCSV.

Газа из вашей строки заголовка и поместить его в файл с именем DATA.CSV

1436136640477044,wsn430-8,NA:b27b,Packet recevied from,RX: b0b4, Hello #33 
1436136640477257,wsn430-8,NA:b27b,Packet recevied from,RX: b986, Hello #33 
1436136640477415,wsn430-8,NA:b27b,Packet recevied from,RX: bc2d, Hello #33 
1436136640477566,wsn430-8,NA:b27b,Packet recevied from,RX: b36b, Hello #34 
1436136640477716,wsn430-8,NA:b27b,Packet recevied from,RX: bcb6, Hello #35 
1436136640477995,wsn430-9,NA:bc2d,Packet recevied from,RX: 1f9e, Hello #33 
1436136640478162,wsn430-9,NA:bc2d,Packet recevied from,RX: be29, Hello #33 
1436136640478313,wsn430-9,NA:bc2d,Packet recevied from,RX: b61a, Hello #32 
1436136640478462,wsn430-9,NA:bc2d,Packet recevied from,RX: c735, Hello #32 
1436136640478612,wsn430-9,NA:bc2d,Packet recevied from,RX: bb0a, Hello #32 
1436136640478760,wsn430-9,NA:bc2d,Packet recevied from,RX: b6bc, Hello #33 
1436136640477044,wsn430-8,NA:b27b,Packet recevied from,RX: b0b1, Hello #42 
1436136640477257,wsn430-8,NA:b27b,Packet recevied from,RX: b984, Hello #44 

Go скачать h2 .jar файл здесь: http://www.h2database.com/html/download.html

А затем запустить этот код ...

import java.io.File; 
import java.net.URISyntaxException; 
import java.net.URL; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class CSVLoader { 

    public static final String getApplicationPath(Class<?> mainClass) throws URISyntaxException { 
    return getApplicationDirectory(mainClass).getAbsolutePath(); 
    } 

    public CSVLoader() { 
    executeStatement(getDropTableStatement(), false); 
    executeStatement(getCreateTableStatement(), false); 
    executeStatement(getInsertStatement(), false); 
    executeStatement(getSelectStatement(), true); 
    } 

    public static final String getDropTableStatement() { 
     String SQLString = "DROP TABLE DATA IF EXISTS;\n"; 
     return SQLString; 
    } 

    public static final String getSelectStatement() { 
     String SQLString = "SELECT NOEUDADRESS, COUNT(NOEUDSRECE) FROM DATA GROUP BY NOEUDADRESS;\n"; 
     return SQLString; 
    } 

    public static final String getCreateTableStatement() { 
     String SQLString = "CREATE TABLE DATA(\n"; 
     SQLString += " NUMERO   VARCHAR(100),\n"; 
     SQLString += " NUMEROWSN  VARCHAR(100),\n";  
     SQLString += " NOEUDADRESS VARCHAR(100),\n"; 
     SQLString += " PACKETRECE  VARCHAR(100),\n"; 
     SQLString += " NOEUDSRECE  VARCHAR(100),\n"; 
     SQLString += " HELLO   VARCHAR(100))"; 

     return SQLString; 
    } 

    public static final String getInsertStatement() { 
    return "INSERT INTO DATA SELECT * FROM CSVREAD('DATA.CSV')"; 
    } 

    public void executeStatement(String sql, boolean withResultSet) { 
    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 

    try { 
     File file = getApplicationDirectory(CSVLoader.class); 
     Class.forName("org.h2.Driver"); 
      connection = DriverManager.getConnection("jdbc:h2:" + file.getAbsolutePath() + File.separator + "storage", "sa", "secret"); 
      statement = connection.createStatement(); 

      if(withResultSet) { 
       resultSet = statement.executeQuery(sql); 
       while(resultSet.next()) { 
       System.out.println("-->" + resultSet.getString(1) + "\t" + resultSet.getString(2)); 
       } 
      } 
      else { 
       statement.execute(sql); 
      } 
     } 
    catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
    catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
     if(resultSet != null) { 
      resultSet.close(); 
     }  
      if(statement != null) { 
      statement.close(); 
     } 
      if(connection != null) { 
      connection.close(); 
     } 
     } 
     catch (SQLException e) { 
     e.printStackTrace(); 
     statement = null; 
     connection = null;   
     } 
    } 
    } 

    private static final File getApplicationDirectory(Class<?> mainClass) throws URISyntaxException { 
    URL url = mainClass.getProtectionDomain().getCodeSource().getLocation(); 
    File file = new File(url.toURI()); 
    return file.getParentFile(); 
    } 

    public static void main(String[] args) { 
    new CSVLoader(); 
    } 
} 

Выходной сигнал

-->NA:b27b 7 
-->NA:bc2d 6 

Вы также можете запустить его из консоли: В приведенном выше примере также работает, когда вы вводите это в консоли:

CREATE TABLE TEST( 
    NUMERO   VARCHAR(100), 
    NUMEROWSN  VARCHAR(100), 
    NOEUDADRESS VARCHAR(100), 
    PACKETRECE  VARCHAR(100), 
    NOEUDSRECE  VARCHAR(100), 
    HELLO   VARCHAR(100) 
) AS SELECT * FROM CSVREAD('C:\\ECLIPSE\\WORKSPACE\\H2\\DATA.CSV') 

enter image description here

Убедитесь в том, чтобы использовать полный путь к файлу данных

+0

Большое спасибо Constantin –

+0

У меня такой же вопрос Я использую Импорт данных из файла CSV: –

+0

CREATE TABLE TEST AS SELECT * FROM CSVREAD ('test.csv'); CREATE TABLE TEST (ID INT PRIMARY KEY, NAME VARCHAR (255)) AS SELECT * FROM CSVREAD ('test.csv'); –

0

Вы можете считывать данные из файла по строкам, делиться по запятой и сохранять отдельные значения в массиве String, а затем создавать Hashmap с ключом как индекс, соответствующий NoeudAdress, и значение как Arraylist столбца вам нужен счетчик. В этом случае счетчик будет размером с соответствующим Arraylist.

Редактировать: Это условная вариация импорта всего csv по OpenCSV. Вместо загрузки всего csv в память мы импортируем только нужные нам данные и в конкретном формате, который нам нужен. Это будет лучше, чем грубый подход.

+0

спасибо за ваш ответ, но я не имею никакого представления о java-программировании –

+2

Почему вы отметили Java в вопросе? –