Skip to content

Commit 3381283

Browse files
committed
Optimized CSV parsing
Signed-off-by: hibo98 <niklasmerkelt@mail.de>
1 parent e7bd03a commit 3381283

File tree

4 files changed

+34
-61
lines changed

4 files changed

+34
-61
lines changed

app/app.iml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
<orderEntry type="library" name="com.journeyapps:zxing-android-embedded-3.6.0" level="project" />
126126
<orderEntry type="library" name="android.arch.lifecycle:viewmodel-1.1.0" level="project" />
127127
<orderEntry type="library" name="com.android.support:support-core-ui-27.1.0" level="project" />
128+
<orderEntry type="library" name="org.apache.commons:commons-csv:1.5@jar" level="project" />
128129
<orderEntry type="library" name="com.android.support:support-annotations:27.1.0@jar" level="project" />
129130
<orderEntry type="library" name="com.android.support:recyclerview-v7-27.1.0" level="project" />
130131
<orderEntry type="library" name="android.arch.lifecycle:livedata-core-1.1.0" level="project" />

app/build.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ android {
44
compileSdkVersion 27
55

66
defaultConfig {
7-
applicationId "de.schkola.kitchenscanner2"
7+
applicationId "de.schkola.kitchenscanner"
88
minSdkVersion 19
99
targetSdkVersion 27
10-
versionCode 1
11-
versionName "1.0.0"
10+
versionCode 2
11+
versionName "1.1.0"
1212
}
1313
compileOptions {
1414
sourceCompatibility JavaVersion.VERSION_1_8
@@ -27,4 +27,5 @@ dependencies {
2727
implementation 'com.android.support:design:27.1.0'
2828
implementation 'com.android.support:support-fragment:27.1.0'
2929
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
30+
implementation 'org.apache.commons:commons-csv:1.5'
3031
}

app/src/main/java/de/schkola/kitchenscanner/activity/SettingsActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private void startCopy(boolean allergy) {
115115
int text = allergy ? R.string.choose_allergy : R.string.choose_day;
116116
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
117117
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
118-
intent.setType("text/*");
118+
intent.setType("text/csv");
119119
startActivityForResult(intent, allergy ? REQUEST_CODE_ALLERGY : REQUEST_CODE_DAY);
120120
}
121121

app/src/main/java/de/schkola/kitchenscanner/task/JsonScanTask.java

Lines changed: 28 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,16 @@
2828
import android.os.AsyncTask;
2929
import android.util.JsonWriter;
3030

31-
import java.io.BufferedReader;
31+
import org.apache.commons.csv.CSVFormat;
32+
import org.apache.commons.csv.CSVParser;
33+
import org.apache.commons.csv.CSVRecord;
34+
3235
import java.io.File;
33-
import java.io.FileNotFoundException;
3436
import java.io.FileOutputStream;
3537
import java.io.IOException;
3638
import java.io.InputStream;
37-
import java.io.InputStreamReader;
3839
import java.io.OutputStreamWriter;
39-
import java.io.UnsupportedEncodingException;
40+
import java.nio.charset.Charset;
4041

4142
public class JsonScanTask extends AsyncTask<InputStream, Void, Boolean> {
4243

@@ -58,15 +59,22 @@ protected void onPreExecute() {
5859
@Override
5960
protected Boolean doInBackground(InputStream... inputStreams) {
6061
try {
61-
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStreams[0], "ISO-8859-1"));
62+
CSVFormat format = CSVFormat.DEFAULT;
63+
if (!allergy) {
64+
format.withDelimiter(';')
65+
.withSkipHeaderRecord()
66+
.withHeader("WT", "KW", "Klasse", "XBA", "Name", "Gericht");
67+
}
68+
69+
CSVParser csvParser = CSVParser.parse(inputStreams[0], Charset.forName("ISO-8859-1"), format);
6270
File json = new File(jsonFolder, allergy ? "allergy.json" : "day.json");
6371
JsonWriter writer = new JsonWriter(new OutputStreamWriter(new FileOutputStream(json), "ISO-8859-1"));
6472
if (allergy) {
65-
scanAllergy(reader, writer);
73+
scanAllergy(csvParser, writer);
6674
} else {
67-
scanDay(reader, writer);
75+
scanDay(csvParser, writer);
6876
}
69-
} catch (UnsupportedEncodingException | FileNotFoundException e) {
77+
} catch (IOException e) {
7078
e.printStackTrace();
7179
} finally {
7280
try {
@@ -83,51 +91,16 @@ protected void onPostExecute(Boolean aBoolean) {
8391
dialog.cancel();
8492
}
8593

86-
private void scanDay(BufferedReader reader, JsonWriter writer) {
87-
int clazz = 2;
88-
int xba = 3;
89-
int name = 4;
90-
int lunch = 5;
94+
private void scanDay(CSVParser csvParser, JsonWriter writer) {
9195
try {
9296
writer.beginArray();
93-
String csvLine;
94-
boolean first = true;
95-
boolean headline = false;
96-
while ((csvLine = reader.readLine()) != null) {
97-
String[] line = csvLine.split(csvLine.split(",").length > 2 ? "," : ";");
98-
if (first) {
99-
for (int i = 0; i < line.length; i++) {
100-
if (line[i].replace("\"", "").equalsIgnoreCase("Klasse")) {
101-
clazz = i;
102-
headline = true;
103-
} else if (line[i].replace("\"", "").equalsIgnoreCase("XBA")) {
104-
xba = i;
105-
headline = true;
106-
} else if (line[i].replace("\"", "").equalsIgnoreCase("Name")) {
107-
name = i;
108-
headline = true;
109-
} else if (line[i].replace("\"", "").equalsIgnoreCase("Gericht")) {
110-
lunch = i;
111-
headline = true;
112-
}
113-
}
114-
if (!headline) {
115-
writer.beginObject();
116-
writer.name("class").value(line[clazz].replace("\"", ""));
117-
writer.name("xba").value(Integer.parseInt(line[xba].replace("\"", "")));
118-
writer.name("name").value(line[name].replace("\"", ""));
119-
writer.name("lunch").value(line[lunch].replace("\"", ""));
120-
writer.endObject();
121-
}
122-
first = false;
123-
} else {
124-
writer.beginObject();
125-
writer.name("class").value(line[clazz].replace("\"", ""));
126-
writer.name("xba").value(Integer.parseInt(line[xba].replace("\"", "")));
127-
writer.name("name").value(line[name].replace("\"", ""));
128-
writer.name("lunch").value(line[lunch].replace("\"", ""));
129-
writer.endObject();
130-
}
97+
for (CSVRecord record : csvParser) {
98+
writer.beginObject();
99+
writer.name("class").value(record.get("Klasse"));
100+
writer.name("xba").value(Integer.parseInt(record.get("XBA")));
101+
writer.name("name").value(record.get("Name"));
102+
writer.name("lunch").value(record.get("Gericht"));
103+
writer.endObject();
131104
}
132105
writer.endArray();
133106
writer.close();
@@ -136,17 +109,15 @@ private void scanDay(BufferedReader reader, JsonWriter writer) {
136109
}
137110
}
138111

139-
private void scanAllergy(BufferedReader reader, JsonWriter writer) {
112+
private void scanAllergy(CSVParser csvParser, JsonWriter writer) {
140113
int xba = 0;
141114
int allergy = 1;
142115
try {
143116
writer.beginArray();
144-
String csvLine;
145-
while ((csvLine = reader.readLine()) != null) {
146-
String[] line = csvLine.split(",");
117+
for (CSVRecord record : csvParser) {
147118
writer.beginObject();
148-
writer.name("xba").value(Integer.parseInt(line[xba]));
149-
writer.name("allergy").value(line[allergy]);
119+
writer.name("xba").value(Integer.parseInt(record.get(xba)));
120+
writer.name("allergy").value(record.get(allergy));
150121
writer.endObject();
151122
}
152123
writer.endArray();

0 commit comments

Comments
 (0)