wczytywanie danych z pliku csv

0

witam,
mam taki problem muszę napisać program, który będzie wczytywał dane z pliku csv a następnie będzie je można edytować i ponownie zapisać. Mógłby ktoś podpowiedzieć jak się do tego zabrać? Jak wczytać te dane z pliku csv i wyświetlić to na ekranie? googl nie bardzo pomaga dlatego pytam tutaj</ort>

0

Do wyświetlenia użyj komponentu JTable.
Wpisz w google "java csv".

0

Dzięki wszystkim, którzy się odezwali. Co do wyświetlenia to udało się skonstruować okno teraz tylko problem jak wypełnić tablice danymi z pliku csv. Co do googla to przeglądałem większość polsko i anglo języcznych stron i nie wiele zrozumiałem. Program ma to być katalog filmów, który wyświetla tytuł, reżysera, autora muzyki i aktora. Ma posiadać możliwość sortowania i edycji. Wrzucę co udało się zrobić do tej pory, przepraszam za ewentualne błędy ale jestem laikiem w programowaniu. Gdyby ktoś miał jakieś sugestie to proszę pisać, tylko tak prosto jak dla "osła"

class Employeeapp

package employeeapp;
import employeeapp.Dane;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;

public class EmployeeApp {
private BeanTableGui<Dane> gui;
private BeanDataModel<Dane>model;
public EmployeeApp() {
List<Dane> elist=Dane.generate(100);
String[] propNames={"NazwaFilmu","Rezyser","Muzyka","Aktorzy"};
String[] colNames={"Tytul filmu","Rezyseria","Muzyk","Aktorzyna"};
model = new
BeanDataModel<Dane>(elist,propNames,colNames);
gui=new BeanTableGui<Dane>("Katalog filmów",model);
//wyrównanie dat do prawej
TableCellRenderer cellRenderer=gui.getTable().getDefaultRenderer(Date.class);
((JLabel) cellRenderer).setHorizontalAlignment(JLabel.RIGHT);
gui.pack();
gui.setLocationRelativeTo(null);
gui.setVisible(true);
}
public static void main(String[] args) {
try{
}catch (Exception e) {e.printStackTrace();}
new EmployeeApp();
}
}

class Edycja

package employeeapp;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 *
 * @author Admin
 */
public class Edycja extends JFrame {
  public JTextField[] pole;
  private BeanDataModel model;
  private JLabel[] etykieta;  
  int liczba_pol;
  String nazwa_kolumny;
  public Edycja(){
        setTitle("Edycja");
        setSize(200,200);
        
        liczba_pol=model.getColumnCount();
        pole=new JTextField[liczba_pol];
        etykieta=new JLabel[liczba_pol];
       
        for(int i=0;i<liczba_pol;i++){
            nazwa_kolumny=model.getColumnName(i);
            etykieta[i]=new JLabel("nazwa_kolumny");
            getContentPane().add(etykieta[i]);
            pole[i]=new JTextField();
            getContentPane().add(pole[i]);
        }
        JButton ok=new JButton("Zatwierdz");
        JButton cancel=new JButton("Odrzuc");
        getContentPane().add(ok);
        getContentPane().add(cancel);
        pack();
        setVisible(true);
  }
  
  
}

class Dane(chyba niepotrzebna, bo dane mają być wczytywane z pliku csv a nie z klasy)

package employeeapp;

import java.io.Serializable;
import java.util.List;
import java.util.Vector;

/**
 *
 * @author pusk
 */

public class Dane implements Serializable, Comparable<Dane>{
private String NazwaFilmu=" ";
private String Rezyser=" ";
private String Muzyka=" ";
private String Aktorzy=" ";
//private Integer Rok_produkcji;
public Dane(String NazwaFilmu,String Rezyser,String Muzyka,String Aktorzy){
 //super();
 this.NazwaFilmu=NazwaFilmu;
 this.Rezyser=Rezyser;
 this.Muzyka=Muzyka;
 this.Aktorzy=Aktorzy;
// this.Rok_produkcji=Rok_produkcji;
}
// Gettery i setery dla wszystkich pól np.
public String getNazwa_filmu(){
return NazwaFilmu;
}
public void setNazwa_Filmu(String NazwaFilmu){
this.NazwaFilmu=NazwaFilmu;
}
public String getRezyser(){
    return Rezyser;
}
public void setRezyser(String Rezyser){
    this.Rezyser=Rezyser;
 }
public String getMuzyka(){
    return Muzyka;
}
public void setMuzyka(String Muzyka){
    this.Muzyka=Muzyka;
}
public String getAktorzy(){
    return Aktorzy;
}
public void setAktorzy(String Aktorzy){
    this.Aktorzy=Aktorzy;
}
//public Integer getRok_produkcji(){
   // return Rok_produkcji;
//}
//public void setRok_produkcji(Integer Rok_produkcji){
  //  this.Rok_produkcji=Rok_produkcji;
//}
//public String toString(){
//return Nazwa_filmu+"; "+Rezyser+"; "+ Muzyka+"; "+Aktorzy+"; "+Rok_produkcji;
//}
//normalny porządek
@Override
public int compareTo(Dane o) {
int r=NazwaFilmu.compareTo(o.NazwaFilmu);
if (r==0)r=Rezyser.compareTo(o.Rezyser);
if(r==0)r=Muzyka.compareTo(o.Muzyka);
if(r==0)r=Aktorzy.compareTo(o.Aktorzy);
//if (r==0)r=Rok_produkcji-o.Rok_produkcji;
return r;
}
static List generate(int i) {
List<Dane> elist = new Vector <Dane>();
elist.add(new Dane("Rambo","Spilberg","Moricone","Stallone"));
//elist.add(new Dane(" "," "," "," "));

return elist;
}
}

class BeanTableGui

package employeeapp;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableRowSorter;
public class BeanTableGui<T> extends JFrame implements ActionListener {
// Model danych
private BeanDataModel<T> model;
// Tabela
String[] colNames={"Tytul filmu","Rezyseria","Muzyk","Aktorzyna"};
Object[][]d=new Object[15][5];
private JTable table;
//Sorter
private TableRowSorter<BeanDataModel<T>> sorter;
//private FilterDialog filterDialog;
//private SortPanel sortpanel;
private File file;
String linia=" ";
private Edycja edycja;
public BeanTableGui(String title, final BeanDataModel<T> model) {
super(title);
this.model=model;
//setTitle("Menu");
setSize(400,400);
//JPanel panel=new JPanel();
JMenuBar menubar=new JMenuBar();
JMenu[] menu ={new JMenu("Plik"), new JMenu("Pomoc")};
JMenuItem[] items={new JMenuItem("Odczyt"),new JMenuItem("Zapis"),new JMenuItem("Edycja")};
for(int i=0;i<items.length;i++){
       items[i].addActionListener(this);
       menu[i%1].add(items[i]);
   }
for(JMenu jm:menu)
        menubar.add(jm);
setJMenuBar(menubar);
setBackground(new Color(210,246,255));
setDefaultCloseOperation(EXIT_ON_CLOSE);
// Utworzenie sortera
sorter=new TableRowSorter<BeanDataModel<T>>(model);
// Tabela i ustawienia sortera
table=new JTable(model);
table.setRowSorter(sorter);
this.add(new JScrollPane(table));
 Box controls = Box.createHorizontalBox();
 controls.setBorder(BorderFactory.createEmptyBorder(10,5,5,5));
 Dimension filter=new Dimension(5,5);
 controls.add(button("Sortowanie","cmd::sortuj"));
 controls.add(Box.createRigidArea(filter));
 controls.add(button("Filtrowanie","cmd::filtruj"));
 //controls.add(Box.createGlue());
 controls.add(button("Edycja","cmd::edytuj"));
 controls.add(Box.createRigidArea(filter));
 controls.add(button("Usuwanie","cmd::usun"));
 //controls.add(Box.createGlue());
 add(controls,"South");
}
public BeanDataModel<T> getModel(){
return model;
}
public TableRowSorter<BeanDataModel<T>> getSorter(){
return sorter;
}
public JTable getTable(){
return table;
}
public void actionPerformed(ActionEvent e){
 JFileChooser fileChoser=new JFileChooser();
 //FileFilter type1=new FileFilter("Pliki tekstowe",new String[]{".txt",".doc"})
 fileChoser.setDialogTitle("Otwieranie pliku");
 this.getContentPane().add(fileChoser);
 fileChoser.setVisible(true);

   int ret = fileChoser.showOpenDialog(this);

        if (ret == JFileChooser.APPROVE_OPTION) {
        BufferedReader buf=null;
        
        int k=0;
        file = fileChoser.getSelectedFile();
        fileChoser.getCurrentDirectory().toString();
        try{
        buf = new BufferedReader(new FileReader(file));
             while(linia!=null)
           {
         for(int i=0;i<5;i++)
           {
              linia=buf.readLine();
               
            d[k][i]=linia;   
           }
             k+=1;
          }
        buf.close();
        }catch (IOException w)
        {
           JOptionPane.showMessageDialog(null,"Blad odczytu pliku tekstowego");
         }
        table=new JTable(d,colNames);     
        this.add(new JScrollPane(table));
        //pole_t.append(file.getName());
              //pole_t.setCaretPosition(pole_t.getDocument().getLength());

         }
         if(ret==JFileChooser.CANCEL_OPTION){

         }}

private Component button(String string,String string0) {
 JButton przycisk=new JButton(string);
 przycisk.setActionCommand(string0);
 przycisk.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
         if(e.getActionCommand().equals("cmd::edytuj")){
          edycja=new Edycja();
          edycja.pack();
          edycja.setVisible(true);
    }}
  // System.out.println(e.getActionCommand()); 
   
 });
 return przycisk;
}
}

class BeanDataModel

package employeeapp;

import java.beans.*;
import java.lang.reflect.*;
import java.util.*;
import javax.swing.table.*;

public class BeanDataModel<T> extends AbstractTableModel{
private List<T> rows;
// lista wierszy; elementy listy to referencje do obiektów-ziaren typu T
private String[] colNames;
// nazwy kolumn (nazwy kolumn przekazywane jako argument konstruktora)
private String[] propNames;
// nazwy właściwości ziarna
private static class Accessors{
Method read; //getter
Method write; //seter
// gettery i settery danej właściwości
}
private Map<String, Accessors> accMap= new HashMap <String, Accessors>();
//Mapa akcesororów; Klucz=właściwość, wartość=para getter/seter
// Konstruktor; lista obiektów, tablica nazw właściwości, tablica nazw kolumn
public BeanDataModel(List<T> objList, String[] propNames, String[] colNames) {
if (objList==null ||objList.isEmpty())
throw new IllegalArgumentException("SeanDataModel: empty source");
this.rows=objList;
this.colNames=new String[colNames.length];
System.arraycopy(colNames,0,this.colNames,0,colNames.length);
this.propNames=new String[propNames.length];
System.arraycopy(propNames,0,this.propNames,0,propNames.length);
for (int i=0;i<propNames.length;i++) accMap.put(propNames[i],new Accessors());
// Inicjalizacja Mapy akcesorów
Class klas=objList.get(0).getClass();
// Klasa ziarna elementu na liście
try{
PropertyDescriptor[]
pd=Introspector.getBeanInfo(klas,klas.getSuperclass()).getPropertyDescriptors();
for(PropertyDescriptor desc:pd) {
String name =desc.getName();
Accessors acc=accMap.get(name);
if (acc!=null){
acc.read=desc.getReadMethod();
acc.write=desc.getWriteMethod();
}
}
}catch(IntrospectionException exc){
exc.printStackTrace();
}
}
public int getColumnCount(){
return colNames.length;
}
public int getRowCount() {
return rows.size();
}
@Override
public String getColumnName(int column){
return colNames[column];
}
public Object getValueAt(int r, int c){
T obj=rows.get(r); //ziarno
Object retVal =null;
// wywołanie gettera przez refleksję
try{
Method getter = accMap.get(propNames[c]).read;
retVal=getter.invoke(obj);
}catch (Exception exe) {
exe.printStackTrace();
}
return retVal;
}
@Override
public void setValueAt(Object val, int r,int c){
Object target=rows.get(r); //ziarno na rzecz którego będzie wywołany seter
try{
Method setter=accMap.get(propNames[c]).write;
if (setter == null) return;
setter.invoke(target,val);
}catch (Exception exc) {exc.printStackTrace();
return;
}
fireTableCellUpdated(r,c);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0,columnIndex).getClass();
}
// Komórka jest edytowalna jeżeli dana właściwość ma seter
@Override
public boolean isCellEditable(int r, int c){
return accMap.get(propNames[c]).write==null?false:true;
}
// Własne metody
// Zwrócenie danych z wiersza jako ziarna-obiektu typu T
public T getRow(int r){
return rows.get(r);
}
// Ustalenie wartości komórek wiersza
public void setRow(int r, T obj) {
rows.set(r,obj);
fireTableRowsUpdated(r,r);
}
// Dodanie wiersza na końcu modelu
public void addRow(T row){
rows.add(row);
fireTableRowsInserted(rows.size()-1,rows.size()-1);

}}

Przepraszam jeśli źle wstawiłem kod ale jestem tu po raz pierwszy.

0

Umieszczaj kod między znacznikami < code=java > oraz < /code > (bez spacji) i stosuj wcięcia. Tego co zamieściłeś nie da się czytać.

0

Przepraszam bardzo:-)

Powiem inaczej,mam klasę, w której są podane dane tyle, że statycznie a chciałbym, żeby były pobierane z pliku csv.

package employeeapp;
import java.io.Serializable;
//import java.util.Date;
import java.util.List;
import java.util.Vector;
public class Employee  implements Serializable, Comparable<Employee>{
    private String tytul;
    private String rezyser;
    private String aktor;
    private String muzyka;

public Employee(String tytul, String a, String aktor,String muzyka) {
    super();
    this.rezyser=a;
    this.tytul=tytul;
    this.aktor=aktor;
    this.muzyka=muzyka;
    }
    public Employee(){
    }

    public String getAktor(){
        return aktor;
    }
//  public void setBirthDate(Date birthdate){
//      this.birthDate=birthdate;
//  }
    public String getTytul(){
        return tytul;
    }
    public void setTytul(String tytul){
        this.tytul=tytul;
    }
    public String getRezyser(){
        return rezyser;
    }
    public void setRezyser(String rezyser){
         this.rezyser=rezyser;
    }
    public String getMuzyka(){
        return muzyka;
    }
    public void setMuzyka(String muzyka){
        this.muzyka=muzyka;
    }
    @Override
    public int compareTo(Employee o) {
        int r=tytul.compareTo(o.tytul);
        if (r==0)r=rezyser.compareTo(o.rezyser);
        if (r==0)r=aktor.compareTo(o.aktor);
        if (r==0)r=muzyka.compareTo(o.muzyka);
        return r;
    }
    static List generate(int i) {
List<Employee> elist = new Vector <Employee>();
//SimpleDateFormat dateformat= new SimpleDateFormat("yyyyMMdd");
elist.add(new Employee("Rambo","Stiven Spielberg","Sylvester Stalone","Enio Moricone"));
elist.add(new Employee("Pan Tadeusz","Andrzej Wajda","Michał Żebrowski","Fryderyk Chopin"));
elist.add(new Employee("Psy","Pasikowski","Linda","Fryderyk Chopin"));
elist.add(new Employee("Ogniem i mieczem","Andrzej Wajda","Daniel Olbrychski","Wojciech Kilar"));
elist.add(new Employee("Kiler","Juliusz Machulski","Cezary Pazura","Piotr Rubik"));
      return elist;
    }
}

Chodzi o to żeby nie wpisywać tych danych tylko żeby były pobierane z pliku.
Jeśli ktoś może pomóc to byłbym wdzięczny.

0
        try
        {
            Scanner sc=new Scanner(new File("Filmy.csv"));
            while(sc.hasNext())
            {
                String[] elementy=sc.next().split(";");
                elist.add(new Employee(elementy[0],elementy[1],elementy[2],elementy[3]));
            }
            sc.close();
        }
        catch(Exception e)
        {
             //komunikat o błedzie
        }
0

trzeba zaimportować coś jeszcze poza

import java.util.Scanner

bo po usunięciu danych wpisanych i wklejeniu tego kodu podkreśla mi File w linijce

 Scanner sc=new Scanner(new File("Filmy.csv"));
0

zaimportowałem potrzebne klasy niestety nie zadziałał program. Może po prosty źle dodałem ten fragment kodu:-(mógłby ktoś pokazać co usunąć i gdzie to wkleić.

0

Musisz zaimportować klasę java.io.File (jak nie korzystasz z IDE, które samo dopisuje potrzebne importy, to powinieneś nauczyć się szukać w dokumentacji z jakiego pakietu jest klasa).

    static List generate(int i) 
   {
        List<Employee> elist = new Vector  <Employee>();	
        try
        {
            Scanner sc=new Scanner(new File("Filmy.csv"));
            while(sc.hasNext())
            {
                String[] elementy=sc.next().split(";");
                elist.add(new Employee(elementy[0],elementy[1],elementy[2],elementy[3]));
            }
            sc.close();
        }
        catch(Exception e)
        {
             //komunikat o błędzie
        }
      return elist;
    }

Nie wiem do czego Ci jest potrzebny parametr i w funkcji generate().

0

Niby wszystko działa ale dane nie są wczytywane do programu. Pewnie trzeba coś zmienić bo poprzednio odwoływał się do tej klasy poprzez tytul, rezyser i tak dalej a po tej modyfikacji chyba to nie działa?Wrzucę fragment kodu

package employeeapp2;
import java.util.Date;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.table.TableCellRenderer;
public class EmployeeApp {
    private BeanTableGUI<Employee> gui;
    public EmployeeApp() {

        List<Employee> elist = Employee.generate(100);
        String[] propNames={"tytul","rezyser","aktor","muzyka"};
        String[] colNames={"Tytuł filmu","Reżyser","Aktor","Muzyka"};

        BeanDataModel<Employee> model = new
BeanDataModel<Employee>(elist,propNames,colNames);

        gui=new BeanTableGUI<Employee>("Katalog filmów",model);

        //wyrównanie dat do prawej
        TableCellRenderer
cellRenderer=gui.getTable().getDefaultRenderer(Date.class);
        ((JLabel) cellRenderer).setHorizontalAlignment(JLabel.RIGHT);
        gui.pack();
        gui.setLocationRelativeTo(null);
        gui.setVisible(true);
    }

    public static void main(String[] args) {
       
        try{
    }catch (Exception e) {e.printStackTrace();}

        new EmployeeApp();
}
}

Poprzednio po prostu wyświetlał dane, które były wpisane w klasie Employee teraz po wczytywaniu danych tego nie robi.
Może ktoś polecić jakiś dobry kurs java? Albo stronę gdzie jest opisane jak się wczytuje dane.Głupio tak coś robić mając o tym nikłe pojęcie:-(
Dzięki za pomoc.

0

A może byś tak łaskawie zamieścił kod funkcji czytającej?

List<Employee> elist = Employee.generate(100);

0

zamieścić bym zamieścił tylko nie wiem co i gdzie.Dzięki za pomoc. Nie chce nikogo irytować:-)zielony jestem, poszukam jakoś dojdę co i jak. Jeszcze raz dzięki za pomoc

0

Wielkie dzięki dla "Bo". Mój błąd źle wkleiłem. Teraz wszystko ładni śmiga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1