2017-02-27 7 views
1

Ich schreibe Swift-Anwendung, die Protokolldatei analysieren. Protokolldatei string:Swift Split-String zu Array mit Ausschluss

substr1 substr2 "substr 3" substr4 

Ich brauche Array zu erhalten: [substr1, substr2, substr 3, substr4] Aber wenn ich so etwas wie verwenden:

print(stringLine.components(separatedBy: " ")) 

Ich habe: [substr1, substr2, "substr, 3", substr4].

So erhalten Sie Array: [substr1, substr2, substr 3, substr4]?

+0

Sie sagen, Sie 'entfernen?" 'Zeichen vom Anfang und Ende jeder Saite –

+0

Ich habe zwei Arten von Teil: 1) textSubsts, 2)‚text substr‘(einschließlich‚‘) in der Zeile Ich muss String in diese beiden Arten von Teilstring teilen –

Antwort

3

Eine der möglichen Lösungen ist map zu verwenden:

let testSting = "substr1 substr2 \"substr3\" substr4" 

    let mappedString = testString.components(separatedBy: " ").map({$0.replacingOccurrences(of: "\"", with: "")}) 

    print(mappedString) //["substr1", "substr2", "substr3", "substr4"] 

Dieser Fall des Problems erforderlich ist, regulären Ausdrücke zu verwenden, aber dieses Beispiel vorgesehen ist. So zu lösen Problem in Sie sind Fall ist es möglich, auf diese Weise zu gehen:

var testStingArray = testSting.replacingOccurrences(of: "\"", with: "").components(separatedBy: " ") 

var arr = [String]() 

var step = 0 

while step < testStingArray.count { 
    var current = testStingArray[step] 
    var next = step + 1 
    if next < testStingArray.count { 
     if testStingArray[next].characters.count == 1 { 
      current += " " + testStingArray[next] 
      testStingArray.remove(at: next) 
     } 
    } 
    arr.append(current) 
    step += 1 
} 

print(arr)//["substr1", "substr2", "substr 3", "substr4"] 
+0

Ich habe: lassen Sie testString = "substr1 substr2" substr 3 "substr4" (!!!! \ "substr 3 \" nicht \ "substr3 \ ") Benutze deinen Code, ich erhalte: [" substr1 "," substr2 "," substr "," 3 "," substr4 "] Aber ich brauche: [" substr1 "," substr2 "," substr 3 ", "substr4"] –

+0

Ich bearbeite meine Antwort –

+0

Jetzt lasst testSting = "abcd" 'erzeugt' ["ab", "cd"] '- Sobald Sie die Anführungszeichen entfernen, gehen Informationen verloren und das Ergebnis * kann nicht * Sein richtig für alle möglichen Eingaben. –

1

Alternativ können Sie die Zeichenfolge aufgeteilt basierend auf einem CharacterSet und dann die leeren Vorkommen herauszufiltern:

let stringLine = "substr1 substr2 \"substr3\" substr4" 
let array = stringLine.components(separatedBy: CharacterSet(charactersIn: "\" ")).filter { !$0.isEmpty } 
print (array) 

Ausgabe:

Aber das wird nicht korrekt funktionieren, wenn es eine " irgendwo in einem der 'Teilstrings', dann wird diese bestimmte Teilzeichenfolge auch aufgeteilt werden.

+0

Ich habe "substr 3 \", aber nicht "substr3 \" –

+0

In diesem Fall, überprüfen @ OOPer's Antwort und verwenden Regex. Aber bedenken Sie, dass das Schreiben Ihres eigenen CSV-Parsings zu einer Welt voller Verletzungen führen kann :) https://tburette.github.io/blog/2014/05/25/so-you-want-to-write-your-own- CSV-Code / – fguchelaar

1

Sie besser mit regulären Ausdrücken arbeiten würde:

let pattern = "([^\\s\"]+|\"[^\"]+\")" 
let regex = try! NSRegularExpression(pattern: pattern, options: []) 

let line = "substr1 substr2 \"substr 3\" substr4" 

let arr = regex.matches(in: line, options: [], range: NSRange(0..<line.utf16.count)) 
    .map{(line as NSString).substring(with: $0.rangeAt(1)).trimmingCharacters(in: CharacterSet(charactersIn: "\""))} 

print(arr) //->["substr1", "substr2", "substr 3", "substr4"] 
0

Oder einfach durchlaufen die Charaktere und halten Zustand über den genannten Teilen:

//: Playground - noun: a place where people can play 

import UIKit 

extension String { 

    func parse() -> [String] { 

     let delimiter = Character(" ") 
     let quote = Character("\"") 

     var tokens = [String]() 
     var pending = "" 
     var isQuoted = false 
     for character in self.characters { 

      if character == quote { 
       isQuoted = !isQuoted 
      } 
      else if character == delimiter && !isQuoted { 
       tokens.append(pending) 
       pending = "" 
      } 
      else { 
       pending.append(character) 
      } 
     } 

     // Add final token 
     if !pending.isEmpty { 
      tokens.append(pending) 
     } 

     return tokens 
    } 
} 

print ("substr1 substr2 \"substr 3\" substr4".parse()) // ["substr1", "substr2", "substr 3", "substr4"] 
print ("\"substr 1\" substr2 \"substr 3\" substr4".parse()) // ["substr 1", "substr2", "substr 3", "substr4"] 
print ("a b c d".parse()) // ["a", "b", "c", "d"] 

Hinweis: dieser Code nicht übernimmt berücksichtigen, dass doppelte Anführungszeichen "" verwendet werden könnte, um ein einzelnes Zitat zu entkommen. Aber ich weiß nicht, ob das in Ihrem Fall möglich ist.

https://tburette.github.io/blog/2014/05/25/so-you-want-to-write-your-own-CSV-code/