Найти строку в файле .ics с помощью Kotlin - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь сохранить определенные строки из файла .ics в отдельные строки в зависимости от их содержимого. Мне удалось преобразовать файл .ics в строку, но у меня возникают трудности с поиском по строкам, чтобы найти определенные ключевые слова.

Строка (и файл) содержит:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//School of Rochester NY |-ECPv4.8.1//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:School of Rochester NY | 

Мне удалось отобразить текст в logcat, но я не смог сохранить строки как отдельные строки.

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var textView = findViewById<TextView>(R.id.textView)

        val file_name = "education-1e1a4bdab8e.ics"
        val ics_string = application.assets.open(file_name).bufferedReader().use {
            it.readText()
        }

        Log.i("TAG", ics_string)

        textView.text = ics_string

        if (ics_string.contains("BEGIN:VCALENDAR", ignoreCase = true))
        {
            Log.i("TAG", "contains event")
        }


    }

LogCat подтверждает, что текст находится в документе, но не какая строка. Есть ли способ добавить строки текста в виде отдельных строк?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Просто глядя на BufferedReader, у вас уже есть 4 функции, которые все дают вам строки.

  1. readLines дает вам List<String>, содержащий все строки
  2. useLines позволяет вам использовать последовательность строк, которую вы можете затем преобразовать, и гарантирует, что после ее вызова читатель закрывается
  3. lineSequence() возвращает последовательность строк, но не закрывает читатель после вызова
  4. lines() возвращает Stream<String>, содержащий строки и в основномпроисходит от самого BufferedReader.Поскольку вы используете Kotlin, вы, вероятно, не хотите использовать этот метод.
  5. useLines и readLines также доступны на File само по себе

Поскольку я не уверен, чего вы действительно хотите достичь, я рекомендую вам начать с readLines напрямую.Файл ics обычно довольно мал, и с помощью линий вы все равно можете фильтровать / отображать все, что захотите.Тогда следующим лучшим кандидатом, вероятно, будет либо useLines, либо lineSequence.Это действительно зависит от того, что вы будете делать дальше.

0 голосов
/ 21 марта 2019

Вы можете использовать функцию расширения для String, lines(), что-то вроде этого:

fun lines() {
    val text = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//School of Rochester NY |-ECPv4.8.1//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:School of Rochester NY |"""

    val foundLines = text.lines().map {
        it.contains("BEGIN:VCALENDAR") to it
    }.filter { (contains, _) -> contains }
     .map { it.second }

    println(foundLines)
}

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