J'ai un fichier contenant environ 39000 ints séparé par des virgules avec 13 ints sur chaque ligne donc j'ai mis en place un lecteur de fichiers et un scanner pour lire et analyser Cependant, il prend littéralement plus d'une heure à courir. Je pense que j'ai probablement besoin d'utiliser un lecteur buffered mais je ne sais pas comment l'implémenter. Quelqu'un peut-il suggérer une meilleure façon (plus rapide) de faire cela?Utilisation de la classe scanner pour analyser un fichier mais il faut beaucoup trop de temps pour exécuter
Voici mon code:
public class ECGFilereader { // reads the ecg files from the SD card
public final static int numChannels = 12; // the data is stored in 12 channels, one for each lead
public final static int numSamples = 3000; //500 = fs so *6 for 6 seconds of data
private File file;
private Scanner scanner;
short [] [] ecg = new short [numChannels] [numSamples]; //Creates a short called ecg in which all of the samples for each channel lead will be stored
public ECGFilereader (String fname) throws FileNotFoundException
{
file = new File(Environment.getExternalStorageDirectory() +"/1009856.txt"); //accesses the ecg file from the SD card
scanner = new Scanner(file);
scanner.useDelimiter(",|\\r\\n"); //sets commas and end's of lines as separators between each int
}
public boolean ReadFile(Waveform[] waves) // sorts data into and array of an array (12 channels each containing 3000 samples)
{
for (int sample=0; sample<numSamples && scanner.hasNextInt(); sample++) //
{
scanner.nextInt();
for (int chan = 0; chan<numChannels; chan++)
{
if(scanner.hasNextInt())
ecg [chan] [sample] = (short) scanner.nextInt();
else if (scanner.hasNextLine())
{ scanner.nextLine();
}
else return false;
}
}
for (int chan=0; chan<numChannels; chan++)
waves[chan].setSignal(ecg[chan]); // sets a signal equal to the ecg array of samples for each channel
return true;
}
}
EDIT:
Je suis maintenant retiré de la classe du scanner complètement et il fonctionne parfaitement avec le code suivant:
public boolean ReadFile(Waveform[] waves) // sorts data into and array of an array (12 channels each containing 3000 samples)
{
try {
BufferedReader in = new BufferedReader(new FileReader(file));
String reader = "";
for (int sample=0; sample<numSamples; sample++){
if ((reader = in.readLine()) == null) {
break;}
else {
String[] RowData = reader.split(","); // sets the commas as separators for each int.
for (int chan=0; chan <12 && chan<RowData.length; chan++)
ecg [chan][sample]= Integer.parseInt(RowData[chan+1]); //parses each int from the current row into each channel for the ecg[]
}
}
in.close();
} catch (IOException e) {
}
for (int chan=0; chan<numChannels; chan++)
waves[chan].setSignal(ecg[chan]); // sets a signal equal to the ECG array of samples for each channel
return true;
}
}
Merci pour l'aide, je vais regarder dans TraveView pour référence future. Pour cela, j'ai complètement remplacé la classe scanner et je l'ai fait fonctionner à la fin avec l'aide d'un ami. Je posterai ce que j'ai fait comme réponse imminente. Merci aussi pour la suggestion sur la vérification de la carte SD est disponible. – Jacko85
Pas de problème! Je suis content que vous ayez votre code de travail. BufferedReader est ce qui est généralement recommandé d'utiliser dans la plupart des cas, de toute façon. N'oubliez pas de marquer une réponse comme correcte si elle a résolu votre problème! Bienvenue à SO et bon codage :) – Codeman