Одна функция в приложении, которое я пишу, предназначена для построчного чтения файла и использования данных, прочитанных из файла, для других операций. У меня проблема исключительно с чтением самих файлов. У меня есть текстовый файл, который выглядит примерно так:
TRAVEL TRACKER,/
ADDRESS1/CITY1/STATE1/ZIP1/LABEL1/RADIUS1
ADDRESS2/CITY2/STATE2/ZIP2/LABEL2/RADIUS2
ADDRESS3/CITY3/STATE3/ZIP3/LABEL3/RADIUS3
Код, который я написал для импорта этих значений, выглядит следующим образом:
// TODO: Figure out what's going on with this.
private fun readFile(file: String) {
// 1. Retrieve the file
val selectedFile = File(file)
// 2. Read all lines from the file
var allLines: MutableList<String> = selectedFile.readLines() as MutableList<String>
// 3. Split the header line into the config string and chosen delimiter
var configLine: List<String> = allLines[0].split(",", ignoreCase = true, limit = 0)
// Check to see if the file exists
if (!selectedFile.exists()) {
showAlert("The selected file doesn't seem to exist. Please select another.")
} else {
if (configLine[0].toLowerCase() == "travel tracker") {
var delimiter = configLine[1] // Retrieve delimiter
var iterator = 0 // Create iterator
allLines.removeAt(0) // Remove header line from list of lines so loop starts at index 0
try {
for (i in allLines) {
var nextLineValue = allLines[iterator].split(delimiter, ignoreCase = true, limit = 0)
var newReminder = Reminder() // Create reminder
newReminder.address = nextLineValue[0] // Add address
newReminder.city = nextLineValue[1] // Add city
newReminder.state = nextLineValue[2] // Add state
newReminder.zip = nextLineValue[3] // Add ZIP Code
newReminder.message = nextLineValue[4] // Add note
newReminder.radius = getMetersFromMiles(nextLineValue[5].toDouble()) // Add radius (in meters)
// Get latitude and longitude
val geoCoder = Geocoder(this)
val locationName = newReminder.address + ", " + newReminder.city + ", " + newReminder.state + " " + newReminder.zip
addressList = geoCoder.getFromLocationName(locationName, 1)
val address: Address = addressList[0]
val latLng = LatLng(address.latitude, address.longitude)
newReminder.latLng = latLng
add(newReminder)
drawCircle(newReminder.latLng, newReminder.radius, newReminder.message)
saveAll(locationList)
iterator++
}
} catch (e: Exception) {
showAlert("An error was encountered:\n\n$e")
}
saveAll(locationList)
reminderAdapter.notifyDataSetChanged()
covertRefresh("Locations successfully imported!")
} else {
var configString = configLine[0] + "\n" + configLine[1]
showAlert("There was an issue with the header of the selected file. Please check the file and try again." +
"\n\nHeader Information:\n$configString")
}
}
}
Когда этот файл экспортируется приложением, я я могу без проблем импортировать его, используя написанную мной функцию. Я также могу импортировать идентичный текстовый файл, когда он сохранен в Windows Блокноте. Однако я не могу импортировать тот же файл, когда он экспортируется из Документов Google. Я задал вопрос об этом здесь и решил взглянуть на символы EoL, потому что я заметил, что файлы, которые я сохраняю из Google Docs, на 5 байтов больше, чем другие, но то, что я заметил, не Это действительно похоже на мою проблему. Вот файлы с символами, видимыми в Notepad ++:
Application
Notepad (Windows)
Google Документы
Как упоминалось выше, я могу без проблем импортировать файлы приложения и Блокнота, тогда как файл, экспортированный из Google Docs, не работает.
Я прошел через типичные маршруты отладки и попытался изменить кодировку чтения на readLines(charset: Charset)
, но на самом деле ничего не сделал, кроме возврата проблемы с заголовком. Импорт отлично работает со списками, созданными приложением, которые, как правило, и будут использоваться, но есть проблемы с другими, которые сильно усложняют это простое дело.
Что может быть не так? Можно ли как-нибудь прочитать эти файлы с определенной кодировкой, чтобы не столкнуться с этими проблемами?