Skip to content

Commit 5e9d5f8

Browse files
committed
Update CsvTransactionsExporter.java
@thatsokay's code in codinguser/gnucash-android PR codinguser#904: 1) Removed trailing CSV separator at the end of heading line 2) Trailing separator was causing CSV parsers to error due to mismatched number of columns Reformatted file
1 parent d777101 commit 5e9d5f8

File tree

1 file changed

+31
-28
lines changed

1 file changed

+31
-28
lines changed

app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@
1818

1919
import android.database.Cursor;
2020
import android.database.sqlite.SQLiteDatabase;
21+
import android.support.annotation.NonNull;
2122
import android.util.Log;
2223

23-
import androidx.annotation.NonNull;
24-
25-
import com.google.firebase.crashlytics.FirebaseCrashlytics;
24+
import com.crashlytics.android.Crashlytics;
2625

2726
import org.gnucash.android.R;
2827
import org.gnucash.android.export.ExportParams;
2928
import org.gnucash.android.export.Exporter;
30-
import org.gnucash.android.model.Account;
3129
import org.gnucash.android.model.Split;
3230
import org.gnucash.android.model.Transaction;
3331
import org.gnucash.android.model.TransactionType;
@@ -38,7 +36,7 @@
3836
import java.io.IOException;
3937
import java.text.DateFormat;
4038
import java.text.SimpleDateFormat;
41-
import java.util.Arrays;
39+
import java.util.Collections;
4240
import java.util.Date;
4341
import java.util.HashMap;
4442
import java.util.List;
@@ -52,9 +50,9 @@
5250
*/
5351
public class CsvTransactionsExporter extends Exporter {
5452

55-
private char mCsvSeparator;
53+
private final char mCsvSeparator;
5654

57-
private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
55+
private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
5856

5957
/**
6058
* Construct a new exporter with export parameters
@@ -87,43 +85,46 @@ public List<String> generateExport() throws ExporterException {
8785
try (CsvWriter csvWriter = new CsvWriter(new FileWriter(outputFile), "" + mCsvSeparator)) {
8886
generateExport(csvWriter);
8987
} catch (IOException ex) {
90-
FirebaseCrashlytics.getInstance().log("Error exporting CSV");
91-
FirebaseCrashlytics.getInstance().recordException(ex);
88+
Crashlytics.log("Error exporting CSV");
89+
Crashlytics.logException(ex);
9290
throw new ExporterException(mExportParams, ex);
9391
}
9492

95-
return Arrays.asList(outputFile);
93+
return Collections.singletonList(outputFile);
9694
}
9795

9896
/**
9997
* Write splits to CSV format
10098
*
10199
* @param splits Splits to be written
102100
*/
103-
private void writeSplitsToCsv(@NonNull List<Split> splits, @NonNull CsvWriter writer) throws IOException {
101+
private void writeSplitsToCsv(@NonNull List<Split> splits, @NonNull CsvWriter writer,
102+
Map<String, String> accountNames, Map<String, String> accountFullNames) throws IOException {
104103
int index = 0;
105104

106-
Map<String, Account> uidAccountMap = new HashMap<>();
107-
108105
for (Split split : splits) {
109106
if (index++ > 0) { // the first split is on the same line as the transactions. But after that, we
110107
writer.write("" + mCsvSeparator + mCsvSeparator + mCsvSeparator + mCsvSeparator
111108
+ mCsvSeparator + mCsvSeparator + mCsvSeparator + mCsvSeparator);
112109
}
113110
writer.writeToken(split.getMemo());
114111

115-
//cache accounts so that we do not have to go to the DB each time
116112
String accountUID = split.getAccountUID();
117-
Account account;
118-
if (uidAccountMap.containsKey(accountUID)) {
119-
account = uidAccountMap.get(accountUID);
113+
114+
// Cache account names
115+
String fullName, name;
116+
if (accountNames.containsKey(accountUID)) {
117+
fullName = accountFullNames.get(accountUID);
118+
name = accountNames.get(accountUID);
120119
} else {
121-
account = mAccountsDbAdapter.getRecord(accountUID);
122-
uidAccountMap.put(accountUID, account);
120+
fullName = mAccountsDbAdapter.getAccountFullName(accountUID);
121+
name = mAccountsDbAdapter.getAccountName(accountUID);
122+
accountFullNames.put(accountUID, fullName);
123+
accountNames.put(accountUID, name);
123124
}
124125

125-
writer.writeToken(account.getFullName());
126-
writer.writeToken(account.getName());
126+
writer.writeToken(fullName);
127+
writer.writeToken(name);
127128

128129
String sign = split.getType() == TransactionType.CREDIT ? "-" : "";
129130
writer.writeToken(sign + split.getQuantity().formattedString());
@@ -141,12 +142,14 @@ private void writeSplitsToCsv(@NonNull List<Split> splits, @NonNull CsvWriter wr
141142

142143
private void generateExport(final CsvWriter csvWriter) throws ExporterException {
143144
try {
144-
List<String> names = Arrays.asList(mContext.getResources().getStringArray(R.array.csv_transaction_headers));
145-
for (int i = 0; i < names.size(); i++) {
146-
csvWriter.writeToken(names.get(i));
145+
String[] names = mContext.getResources().getStringArray(R.array.csv_transaction_headers);
146+
for (int i = 0; i < names.length - 1; i++) {
147+
csvWriter.writeToken(names[i]);
147148
}
148-
csvWriter.newLine();
149+
csvWriter.writeEndToken(names[names.length - 1]);
149150

151+
Map<String, String> nameCache = new HashMap<>();
152+
Map<String, String> fullNameCache = new HashMap<>();
150153

151154
Cursor cursor = mTransactionsDbAdapter.fetchTransactionsModifiedSince(mExportParams.getExportStartTime());
152155
Log.d(LOG_TAG, String.format("Exporting %d transactions to CSV", cursor.getCount()));
@@ -163,13 +166,13 @@ private void generateExport(final CsvWriter csvWriter) throws ExporterException
163166
csvWriter.writeToken("CURRENCY::" + transaction.getCurrencyCode());
164167
csvWriter.writeToken(null); // Void Reason
165168
csvWriter.writeToken(null); // Action
166-
writeSplitsToCsv(transaction.getSplits(), csvWriter);
169+
writeSplitsToCsv(transaction.getSplits(), csvWriter, nameCache, fullNameCache);
167170
}
168171

169172
PreferencesHelper.setLastExportTime(TimestampHelper.getTimestampFromNow());
170173
} catch (IOException e) {
171-
FirebaseCrashlytics.getInstance().recordException(e);
174+
Crashlytics.logException(e);
172175
throw new ExporterException(mExportParams, e);
173176
}
174177
}
175-
}
178+
}

0 commit comments

Comments
 (0)