CSV filer i android

CSV filer er en simpel måde at udveksle data i et menneskevenligt format, men der er mange faldgrupper, især når vi kommer til unicode.

Denne guide viser hvordan man loader CSV filer med danske tegn ind i et java objekt på android. Senere vil der komme en artikel der viser hvordan man eksportere fra et java objekt eller database til CSV.

Hvis man ikke manuelt har lyst til skrive koden der parser CSV filen kan man anvende opencsv biblioteket fra http://opencsv.sourceforge.net/ der håndtere en lang række irriterende edge cases for dig.

For at bruge den skal du tilføje den downloadede jar fil til dit projekt og inkludere:

[code language=”java”]

import au.com.bytecode.opencsv.CSVReader;

[/code]

Først har jeg følgende funktion der spørger brugeren om han vil indlæse en ny fil og derefter viser den indbyggede filhåndtering hvor brugeren kan vælge csv filen. Koden kræver at der er installeret en filvælger på systemet, det er der ikke som standard i android emulatoren.

[code language=”java”]

try {

AlertDialog.Builder alert = new AlertDialog.Builder(this);

alert.setTitle(“Indlæs fil”);

alert.setMessage(“Vil du indlæse en ny fil?”);

alert.setPositiveButton(“Indlæs”, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

try {

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

intent.setType("file/*");

startActivityForResult(intent,PICKFILE_RESULT_CODE);

}

catch (Exception ex)

{

Toast.makeText(getApplicationContext(), “Fejl!”, Toast.LENGTH_SHORT).show();

}

}

});

alert.setNegativeButton("Fortryd", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

// Canceled.

}

});

alert.show();

}

catch (Exception ex)

{

Toast.makeText(getApplicationContext(),

getString(“Ukendt fejl!”), Toast.LENGTH_SHORT).show();

}

[/code]

Funktionaliteten i denne funktion vil jeg ikke gå nærmere ind i men når brugeren har færdiggjort sit valg vil følgende funktion automatisk bliver kaldt og det er i denne at CSV funktionaliteten ligger:

[code language=”java”]

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

char seperator =  ‘;’; //Dansk excel bruger ikke komma til komma sepererede filer…

switch(requestCode){

case PICKFILE_RESULT_CODE: //tjek om brugeren valgte en fil

if(resultCode== Activity.RESULT_OK){ //Jeps, det

gjorde han

String pathToFile = data.getData().getPath();

//Stien til den fil brugeren valgte

 

try {

 

File file = new File(pathToFile);

FileInputStream csvStream = new FileInputStream(file);

InputStreamReader csvStreamReader = new InputStreamReader(csvStream, "Windows_1252");

CSVReader csvReader = new CSVReader(csvStreamReader, seperator);

String[] line;

csvReader.readNext();     //kolonnenavnende er jeg ligeglad med i dette tilfælde, eller slet denne linie hvis du vil læse kolonne navne ind eller ikke har kolonnenavn

while ((line = csvReader.readNext()) != null) {

new boat(line[0],line[1],line[2],line[3],line[4],line[5]);  //indlæs linierne en af gangen i et boat objekt

}

} catch (Exception e) {

e.printStackTrace();

Toast.makeText(getApplicationContext(),"Error, problem with input file!", Toast.LENGTH_SHORT).show();

}

}

break;

}

}

[/code]

Denne funktion læser CSV filen ind i et java objekt kaldet boat der tager strings som parameter (hvordan man gemmer dem i en database kommer i en senere artikel). Jeg antager at kommentarerne i koden forklare det meste af funktionen men herunder er der uddybende detaljer.

Det første funktionen gør er at sætte separatoren til semikolon, da programmet egentligt er lavet til at importere csv filer der er lavet i danske udgaver af excel og den på trods af at filerne er kaldt komma separerede bruger semikolon i stedet (en engelsk excel bruger komma). Her kan man vælge at hvis indlæsningen med kolon fejler at bruge semikolon eller spørge den om der er flest kommaer eller semikoloner (excel gemmer ikke noget meta data der kan hjælpe dig).

Linien:

[code language=”java”]

InputStreamReader csvStreamReader = new InputStreamReader(csvStream, "Windows_1252");

[/code]

sætter tegnsættet til Windows_1252 da det er der excel benytter og dermed vil special tegn så som æøå blive bevaret. Stammer dine csv filer andetsteds fra vil du ganske givet skulle bruge et andet tegnsæt, UTF-8 vil være et godt udgangspunkt hvis du har tegn der ikke er i det engelske alfabet.