2017-10-14 2 views
-1

Je crée une application où je fais de l'analyse d'images en temps réel et les stocke dans un fichier csv. Le csv a 2 colonnes et la valeur y de chaque image.Comment lire un fichier CSV?

Je souhaite lire ce fichier et stocker les valeurs de 2 colonnes dans un tableau double. Je veux cela parce que je veux effectuer une transformation rapide de Fourier sur les données.

public class MainActivity extends AppCompatActivity implements CameraView.PreviewReadyCallback { 
private static Camera camera = null; 
private CameraView image = null; 

private LineChart bp_graph; 
private int img_Y_Avg, img_U_Avg, img_V_Avg; 
private long end = 0, begin = 0; 
double valueY, valueU, valueV; 
Handler handler; 
private int readingRemaining = 1200; 
private static long time1, time2, timeDifference; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    bp_graph = (LineChart)findViewById(R.id.graph); 


    graph_features(); 

    //open camera 
    try { 
     camera = Camera.open(); 

     handler = new Handler(); 
     final Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       camera.stopPreview(); 
       camera.release(); 
      } 
     }; 
     handler.postDelayed(runnable, 30000); 

    } catch (Exception e) { 
     Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
    } 

    if (camera != null) { 
     image = new CameraView(this, camera); 
     FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view); 
     camera_view.addView(image); 
     image.setOnPreviewReady(this); 
    } 


} 


@Override 
protected void onResume(){ 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
} 


@Override 
public void onPreviewFrame(long startTime, int ySum, int uSum, int vSum, long endTime) { 
    begin = startTime; 
    img_Y_Avg = ySum; 
    img_U_Avg = uSum; 
    img_V_Avg = vSum; 
    end = endTime; 

    showResults(begin, img_Y_Avg, img_U_Avg, img_V_Avg, end); 


} 

private void showResults(long startTime, int ySum, int uSum, int vSum, long endTime){ 

    //set value of Y on the text view 
    TextView valueOfY = (TextView)findViewById(R.id.valueY); 
    //valueY = img_Y_Avg; 
    valueOfY.setText(String.valueOf(img_Y_Avg)); 

    //start time in milliseconds 
    long StartDurationInMs = TimeUnit.MILLISECONDS.convert(begin, TimeUnit.MILLISECONDS); 
    ArrayList<Long> startOfTime = new ArrayList<>(); 
    startOfTime.add(StartDurationInMs); 

    //store value to array list 
    ArrayList<Integer> yAverage = new ArrayList<>(); 
    yAverage.add(img_Y_Avg); 

    //convert to readable format 
    String readableDate = new SimpleDateFormat("MMM dd,yyyy, HH:mm:ss.SSS").format(EndDurationInMs); 
    Log.d("Date ", readableDate); 


    Log.d("time ", String.valueOf(String.valueOf(yAverage.size()))); 
    //store when all array are generated 
    Log.d("time ", String.valueOf(StartDurationInMs)); 


    ArrayList<Long> getValues = new ArrayList<>(); 

    for(int i = 0; i < yAverage.size(); i++) { 
     getValues.add(startOfTime.get(i)); 
     getValues.add((long)(yAverage.get(i))); 
    } 

    //store the yAverage and start time to csv file 
    storeCsv(yAverage, getValues); 


    Log.d("MyEntryData", String.valueOf(getValues)); 

} 

public void storeCsv(ArrayList<Integer>yAverage, ArrayList<Long>getValues){ 

    String filename = "temporary.csv"; 

    //File directoryDownload = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bpReader"; 
    //File logDir = new File (directoryDownload, "bpReader"); //Creates a new folder in DOWNLOAD directory 
    File logDir = new File(path); 
    logDir.mkdirs(); 
    File file = new File(logDir, filename); 


    FileOutputStream outputStream = null; 
     try { 
      file.createNewFile(); 
      outputStream = new FileOutputStream(file, true); 
      //outputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
      for (int i = 0; i < yAverage.size(); i += 2) { 
       outputStream.write((getValues.get(i) + ",").getBytes()); 
       outputStream.write((getValues.get(i + 1) + "\n").getBytes()); 
       //outputStream.write((getValues.get(i + 2) + ",").getBytes()); 
       //outputStream.write((getValues.get(i + 3) + "\n").getBytes()); 
      } 
      outputStream.flush(); 
      outputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

public void readCsv(){ 

} 
} 

Ceci est mon MainActivity. Ce que je fais ici, c'est obtenir les données de CameraView classe pour chaque image à l'aide d'une interface que j'ai créée. Après cela, im stocker les valeurs dans un fichier CSV appelé temporary.csv.

Questions

  1. Je veux lire csv et stocker la première colonne (le temps) dans une double matrice et la deuxième colonne (yAverage) dans un autre double tableau.
  2. Je veux également supprimer le fichier une fois que j'ai toutes les données stockées dans le dans la double matrice.

Comment puis-je faire cela?

+0

où avez-vous fichier csv est stocké dans les actifs ou le serveur –

+0

Il est stocké dans mon externe stockage de mon appareil. Si vous voyez la méthode 'storeCsv', vous pouvez voir que je l'ai stocké dans le stockage externe et j'ai inséré un dossier appelé' bpReader'. – Mill3r

+0

voici un bon exemple de [Comment lire le fichier csv dans android] (https://inducesmile.com/android-tips/android-how-to-read-csv-file-from-remote-server-or-assets -folder-in-android /) il peut vous aider à jeter un oeil –

Répondre

1

Je vous suggère d'utiliser une bibliothèque Open Source comme OpenCSV pour obtenir les données du fichier CSV. Lorsque la bibliothèque est implémentée, il suffit de parcourir les colonnes x et y et de les assigner à un tableau. Avec OpenCSV, ça ressemblerait à ça. Mais je vous suggérerais également une approche plus orientée objet si les x et y avec les mêmes coordonnées d'index sont liés les uns aux autres.

String csvFile = "/Users/mkyong/csv/country3.csv"; 
    int length = 100; //If you dont know how many entries the csv file has i would suggest to use ArrayList 
    double[] xCoords = new double[length]; 
    double[] yCoords = new double[length]; 


    CSVReader reader = null; 
    try { 
     reader = new CSVReader(new FileReader(csvFile)); 
     String[] line; 
     int i = 0; 
     while ((line = reader.readNext()) != null) { 
      xCoords[i] = Double.parseDouble(line[0]); 
      yCoords[i] = Double.parseDouble(line[1]); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

J'ai enregistré le chemin vers mon fichier csv stocké et j'ai trouvé qu'il était '/ storage/emulated/0/bpReader/temporary.csv', donc pour' csvFile' j'ai spécifié ce chemin. Je reçois une erreur dans la ligne 'lecteur = nouveau CSVReader (nouveau FileReader (csvFile));' disant 'java.lang.NoClassDefFoundError: Résolution échouée de: Lorg/apache/commons/lang3/ObjectUtils;'. Je suis toujours confus avec la façon de spécifier le chemin d'accès à mon fichier. – Mill3r

+0

Résolu le problème .. a dû ajouter 'https: // mvnrepository.com/artefact/org.apache.commons/commons-lang3/3.6' à gradle. et définissez le chemin du fichier en tant que 'String getPath = Environment.getExternalStorageDirectory() + "/ bpReader"; Chaîne csvFile = "temporary.csv"; Chemin de chaîne = getPath + "/" + csvFile; – Mill3r

0

De la réponse donnée par Lucas, je suis arrivé à la direction ma solution

public void readCsv(){ 
    //set the path to the file 
    String getPath = Environment.getExternalStorageDirectory() + "/bpReader"; 
    String csvFile = "temporary.csv"; 
    String path = getPath+ "/" + csvFile; 


    //File file = new File(path, csvFile); 
    int length = 500; 
    double[] xCoords = new double[length]; 
    double[] yCoords = new double[length]; 


    CSVReader reader = null; 
    try { 
     File myFile = new File (path); 
     reader = new CSVReader(new FileReader(myFile)); 
     String[] line; 
     int i = 0; 
     while ((line = reader.readNext()) != null) { 
      xCoords[i] = Double.parseDouble(line[0]) ; 
      yCoords[i] = Double.parseDouble(line[1]); 
      Log.d("read:: ", "Time: "+String.valueOf(xCoords[i])+" Y: "+String.valueOf(yCoords[i])); 
     } 

     myFile.delete(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Et puis je dû ajouter

// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.6' 

à mon gradle ,, qui se trouve