2016-11-06 4 views
1

Ich brauche etwas Hilfe mit einem Projekt, an dem ich arbeite. Der erste Teil des Projekts besteht darin, ein Dienstprogramm/Werkzeug zu erstellen, das falsche Daten generiert und in eine CSV-Textdatei schreibt. Dieser Teil funktioniert gut.Datei lesen in Java und MySQL Datenbank

Hier ist der Code für das ist

import sys 
from faker import Factory 
fake = Factory.create() 

x = 1 
param1 = int(sys.argv[1]) 
f = open('myfile.txt','w') 
for x in range (0,param1): 
f.write(fake.first_name() + "," + fake.last_name() + "," + fake.job() + "," + fake.email() + "," 
    + fake.street_address() + "," + fake.city() + "," + fake.state() + "," + fake.state_abbr() + "," 
    + fake.zipcode() + "," + fake.credit_card_provider() + "," 
    + fake.credit_card_number() + "," + fake.phone_number() + "\n") 

f.close() 
(wenn es hilft)

Hier ist, was aus druckt, wenn zusammengestellt:

William,James,Careers information officer,[email protected],9448 Rodriguez Brook Apt. 796,South Lynnbury,South Carolina,VA,26103,JCB 16 digit,3112583369273283,1-002-827-0311x681 

Luis,Martin,Air cabin crew,[email protected],6154 James Cove,Christianberg,New York,RI,37208,JCB 15 digit,378433042568763,+42(0)3011107909 

Jose,Jones,Make,[email protected],431 Jessica Pass,East Robertburgh,Texas,SC,46458,Mastercard,4800941995105607,(047)981-1856x1825 

Mary,Pope,Field seismologist,[email protected],00799 Tracy Trace,Robinburgh,Rhode Island,HI,68855,JCB 16 digit,6011260007331949,+66(4)4995888616 

Jennifer,Villanueva,Tax adviser,[email protected],271 Simmons Mountains,Boydmouth,Nebraska,NM,98981,JCB 16 digit,210077713575961,639.575.1338x414 

Die zusätzlichen Leerzeichen zwischen jeder Zeile, habe ich sie hier für die Zwecke der Lesbarkeit .

Der nächste Teil des Projekts ist die Entwicklung einer Anwendung in Java, die die unstrukturierten Daten aus der CSV-Textdatei in eine normalisierte Datenbank importiert.

Ich habe einige Java-Code, aber es funktioniert nicht die Art, wie ich denke, es sollte (BTW, fühlen Sie sich frei, meine Gedanken zu korrigieren, wie es getan werden sollte). So wie ich es denke sollte, ist arbeiten

  1. Importieren der Daten in Java
  2. Verwenden Sie die vorbereitete Anweisung Funktion, um eine SQL-Anweisung zu erstellen, die die Daten in die Tabelle importieren wird zusammen mit den Funktionen, die .setString sind dafür erforderlich

Allerdings funktioniert es nicht richtig. Zuerst werde ich den Code setzen und dann werde ich erklären, was los ist:

package com.company; 

import java.io.File; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class Main { 

    private static Connection connect() { 
     Connection mysql = null; //sets values to null before actually attempting a connection 
     PreparedStatement pst = null; 
     ResultSet data = null; 
     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 
      String connectionStringURL = "jdbc:mysql://us-cdbr-azure-west-b.cleardb.com:3306/acsm_0a00c1270f36f77"; //database name 
      mysql = DriverManager.getConnection(connectionStringURL, "username", "password"); //username, password 

      if (mysql == null) //check to make sure that it actually connected 
       System.out.println("Connection Failed"); 
      else 
       System.out.println("Success"); 

     } 
     catch (Exception ex) //catches connection failure exception 
     { 
      ex.printStackTrace(); 
     } 
     return mysql; 
    } 

    public static void main(String[] args) throws Exception { 
     String filename = "/Desktop/myfile.txt"; 

     PreparedStatement pstmt = null; 
     Connection mysql = connect(); 
     try 
     { 
      pstmt = mysql.prepareStatement("INSERT INTO Customer (First Name, Last Name, Job, Email, Phone Number) VALUES (?,?,?,?,?)"); 

      Scanner s = new Scanner(new File("/Desktop/myfile.txt")); 
     ArrayList<String> list = new ArrayList<String>(); 
      while (s.hasNextLine()) 
      { 
       list.add(s.nextLine()); 
      } 
      System.out.println(list); 
      s.close(); 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Die erste Funktion offensichtlich Funktion meiner Datenbankverbindung ist, gibt es kein Problem.

Die zweite Funktion ist, wo das Problem liegt. Derzeit habe ich eine vorbereitete Anweisung mit dem SQL-Skript bereits drin. Das wird jedoch noch nicht verwendet. Ich versuche zuerst, die Datei Zeile für Zeile DANN für jedes Feld zu analysieren.

bat ich einen Freund von mir, wie es geht, und er sagte zu

  1. lesen Datei Zeile für Zeile, Split auf Komma und übergeben zu Array
  2. eine Datenklasse machen, die Elemente für jede Spalte in Ihrer Datei erstellt
  3. für jede Array Linie, ein Objekt von Datenklasse
  4. sehen batchExecute() für jdbc
  5. Schreib Insert-Anweisung, und führen Sie
  6. erstellen 210

Für den ersten Schritt, wo es heißt, "an Array übergeben", würde das nur ein Array oder eine ArrayList verwenden, und für beide, würde dies bedeuten, dass jeder Datensatz/Zeile sein eigenes Array/Arraylist hätte?

Ich bin nicht genau sicher, wie man die anderen Schritte auch tut. Ich habe überall im Internet nach Antworten gesucht, aber ich bin kurz gekommen.

Ich glaube nicht, dass ich vergessen habe, etwas zu erwähnen, aber wenn du etwas mehr Klarheit über etwas benötigst, was ich sagte, würde ich gerne versuchen zu erklären, was ich meinte. Jede Hilfe wird geschätzt.

Vielen Dank im Voraus.

Antwort

1

Ich empfehle einen CSV-Parser zu lesen oder in CSV-Datei schreiben. Unten ist ein Beispiel benötigen Sie eine Klasse wie unten

public class Customer { 

    private String firstName; 
    private String lastName; 
    private String job; 
    private String email; 
    private String phone; 

    public Customer(String firstName, String lastName, String job, String email, String phone) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.job = job; 
     this.email = email; 
     this.phone = phone; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getJob() { 
     return job; 
    } 

    public void setJob(String job) { 
     this.job = job; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 
} 
mit opencsv

import com.opencsv.CSVReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 

public class NewClass1 { 
    public static void main(String[] args) { 
     try { 

      String fileName = "yourfile.csv"; 
      List<String[]> customerList = readWholeCsvFile(fileName); 
      Connection conn = getConnection(); 
      persistWithOutDataClass(conn,customerList); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static List<String[]> readWholeCsvFile(String fileName) throws IOException{ 
     List<String[]> myEntries = new ArrayList<>(); 
     CSVReader reader = new CSVReader(new FileReader(fileName), ',' ,'\'', 1); 
     myEntries = reader.readAll(); 
     return myEntries;   
    } 

    public static List<Customer> readCsvFileLineByLine(String fileName) throws IOException{ 
     List<Customer> customerList = new ArrayList<>(); 
     String [] nextLine; 
     CSVReader reader = new CSVReader(new FileReader(fileName), ',' ,'\'', 1); 
     while ((nextLine = reader.readNext()) != null) {   
      customerList.add(new Customer(nextLine[0], nextLine[1], nextLine[2], nextLine[3], nextLine[4])); 
     }  
     return customerList;   
    } 

    private static Connection getConnection() { 
     Connection conn = null; //sets values to null before actually attempting a connection    
     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      String connectionStringURL = "jdbc:mysql://us-cdbr-azure-west-b.cleardb.com:3306/acsm_0a00c1270f36f77"; //database name 
      conn = DriverManager.getConnection(connectionStringURL, "username", "password"); //username, password 
      if (conn == null) //check to make sure that it actually connected 
       System.out.println("Connection Failed"); 
      else 
       System.out.println("Success"); 
     } 
     catch (Exception ex){ 
      ex.printStackTrace(); 
     } 
     return conn; 
    } 

    private static void persistWithOutDataClass(Connection conn, List<String[]> customerList) throws SQLException{ 
     String insertStatement = " insert into Customer (First Name, Last Name, Job, Email, Phone Number) values (?, ?, ?, ?, ?)"; 
     PreparedStatement preparedStmt = conn.prepareStatement(insertStatement); 
     for(String[] row : customerList){ 
      preparedStmt.setString (1, row[0]); 
      preparedStmt.setString (2, row[1]); 
      preparedStmt.setString (3, row[2]); 
      preparedStmt.setString (4, row[3]); 
      preparedStmt.setString (5, row[11]); 
      preparedStmt.addBatch(); 
     } 
     preparedStmt.executeBatch(); 
    } 

    private static void persistWithDataClass(Connection conn, List<Customer> customerList) throws SQLException{ 
     String insertStatement = " insert into Customer (First Name, Last Name, Job, Email, Phone Number) values (?, ?, ?, ?, ?)"; 
     PreparedStatement preparedStmt = conn.prepareStatement(insertStatement); 
     for(Customer cust : customerList){ 
      preparedStmt.setString (1, cust.getFirstName()); 
      preparedStmt.setString (2, cust.getLastName()); 
      preparedStmt.setString (3, cust.getJob()); 
      preparedStmt.setString (4, cust.getEmail()); 
      preparedStmt.setString (5, cust.getPhone()); 
      preparedStmt.addBatch(); 
     } 
     preparedStmt.executeBatch(); 
    } 
} 

Wenn Sie die Verwendung einer Datenklasse machen wollen