Je voudrais analyser un fichier texte qui ressemble plus ou moins à ceci: si une valeur couvre plusieurs lignes, il a toujours des guillemets. S'il s'agit seulement d'une ligne, il a des guillemets ou non (malheureusement, peu importe si c'est un nombre ou une chaîne - il peut également y avoir une chaîne sans guillemets - le format n'est pas très cohérent) P> Et je suis en train de comprendre comment je pourrais les diviser par type et l'analyser efficacement. Je pourrais faire un Donc, je pense à lire tout le fichier dans un existe une manière meilleure / plus efficace de résoudre ce problème d'analyse? P> P> Readlines code> et scinder par
"=" code>. Cela fonctionnerait pour tout sauf
type3 code> dans l'exemple ci-dessus, car il s'étend sur plusieurs lignes. P>
String code> et ensuite faire des
regex code>, par exemple
(. *) = ("([^"] *) "| * \ n) code> ce qui aboutirait au premier groupe de capture qui aboutirait toujours le type et le dernier groupe de capture la valeur. Je viens Peurt que pour les fichiers plus importants, cela pourrait être de ralentir et de causer des problèmes. P>
3 Réponses :
Je suis venu avec cette lecture directe des lignes. Pas sûr qu'il est plus efficace que de charger le fichier entier et de l'utilisation de regex, mais cela pourrait être utile pour des fichiers énormes car il ne lit qu'une ligne à la fois.
fun readCustomPropertiesFile(file: File): Map<String, String> { val map = mutableMapOf<String, String>() var entry = "" var entryComplete = true file.forEachLine { line -> if (entryComplete && '=' !in line){ println("Line is invalid: $line") return@forEachLine } entry = if (entryComplete) line else "$entry\n$line" val (key, value) = entry.split('=', limit = 2) val startQuote = value.startsWith('"') val endQuote = value.endsWith('"') entryComplete = !startQuote || startQuote == endQuote if (entryComplete) { map[key] = if (startQuote && endQuote) value.substring(1, value.length - 1) else value } } return map }
Votre format est si proche de .properties , avec = Code> et dans un peu de formes différentes propriétés multi-lignes, que j'adapte les données et utilisez les propriétés
code>. L'utilisation de UTF-8 aurait besoin d'une petite adaptation et vous avez terminé: Qualité de la production. P>
Je pense que votre idée de lire le fichier dans une chaîne puis d'appliquer une regex fonctionnerait bien. Quelques points: P>
Vous n'avez pas besoin (et probablement pas envie) le S'il est possible qu'une valeur de chaîne puisse contenir un \ n code> dans le motif. p>
123 code> comme valeur de
type1 code>, pas
123 \ n code>. li>.
. code> ne correspond pas
\ n code>, donc
. * code> arrête de correspondre si / quand il frappe un
\ n Code> Quoi qu'il en soit. Li>
\ n code> ne correspondra pas à la correspondance, mais le modèle - sans réussira. li>
ul>
= code>, alors
(. *) = code> ne va pas fonctionner. Par exemple, si une ligne est
type2 = "certains = texte" code>, alors le
(. *) Code> correspondra
type2 = "Quelques code>, que vous Vraisemblablement, je ne veux pas. Vous pouvez résoudre ce problème en utilisant
([^ =] *) = code> ou peut-être
(\ w *) = code>, en fonction des détails du format . p>