Почему мое приложение Android иногда неправильно читает идентичные текстовые файлы? - PullRequest
0 голосов
/ 17 июня 2020

Одна функция в приложении, которое я пишу, предназначена для построчного чтения файла и использования данных, прочитанных из файла, для других операций. У меня проблема исключительно с чтением самих файлов. У меня есть текстовый файл, который выглядит примерно так:

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

The end of line characters for a text file exported by the application.

Notepad (Windows)

The end of line characters for a text file exported by Notepad (Windows).

Google Документы

The end of line characters for a text file exported by Google Docs.

Как упоминалось выше, я могу без проблем импортировать файлы приложения и Блокнота, тогда как файл, экспортированный из Google Docs, не работает.

Я прошел через типичные маршруты отладки и попытался изменить кодировку чтения на readLines(charset: Charset), но на самом деле ничего не сделал, кроме возврата проблемы с заголовком. Импорт отлично работает со списками, созданными приложением, которые, как правило, и будут использоваться, но есть проблемы с другими, которые сильно усложняют это простое дело.

Что может быть не так? Можно ли как-нибудь прочитать эти файлы с определенной кодировкой, чтобы не столкнуться с этими проблемами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...