Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read lines from big text file in Swift until new line is empty: the Swift way

I have the following text file structure (the text file is pretty big, around 100,000 lines):

A|a1|111|111|111
B|111|111|111|111

A|a2|222|222|222
B|222|222|222|222
B|222|222|222|222

A|a3|333|333|333
B|333|333|333|333

...

I need to extract a piece of text related to a given key. For example, if my key is A|a2, I need to save the following as a string:

A|a2|222|222|222
B|222|222|222|222
B|222|222|222|222

For my C++ and Objective C projects, I used the C++ getline function as follows:

std::ifstream ifs(dataPathStr.c_str());

NSString* searchKey = @"A|a2";
std::string search_string ([searchKey cStringUsingEncoding:NSUTF8StringEncoding]);

// read and discard lines from the stream till we get to a line starting with the search_string
std::string line;

while( getline( ifs, line ) && line.find(search_string) != 0 );

// check if we have found such a line, if not report an error
if( line.find(search_string) != 0 )
{
 data = DATA_DEFAULT ;
}

else{

   // we need to form a string that would include the whole set of data based on the selection
   dataStr = line + '\n' ; // result initially contains the first line

   // now keep reading line by line till we get an empty line or eof
   while(getline( ifs, line ) && !line.empty() )
   {
      dataStr += line + '\n'; // append this line to the result
   }

   data = [NSString stringWithUTF8String:navDataStr.c_str()];
} 

As I am doing a project in Swift, I am trying to get rid of getline and replace it with something "Cocoaish". But I cannot find a good Swift solution to address the above problem. If you have an idea, I would really appreciate it. Thanks!

like image 907
Igor Tupitsyn Avatar asked Nov 10 '14 03:11

Igor Tupitsyn


People also ask

How to go next line in Swift?

\n : This is a newline character. It the computer to move to the next line.

Does \n work in Swift?

By default Swift strings can't span more than one line. One simple way around this is to use the new line character \n , but that only works for strings that are displayed – if you're just trying to format your string nicely, you should use multi-line strings instead.

How do I read a string file in Swift?

To read a Text File in Swift, we can prepare the file url and then use String initializer init(contentsOf: url) that returns file content as a string.


1 Answers

Using the StreamReader class from Read a file/URL line-by-line in Swift, you could do that it Swift like this:

let searchKey = "A|a2"

let bundle = NSBundle.mainBundle()
let pathNav = bundle.pathForResource("data_apt", ofType: "txt")
if let aStreamReader = StreamReader(path: pathNav!) {
    var dataStr = ""
    while let line = aStreamReader.nextLine() {
        if line.rangeOfString(searchKey, options: nil, range: nil, locale: nil) != nil {
            dataStr = line + "\n"
            break
        }
    }
    if dataStr == "" {
        dataStr = "DATA_DEFAULT"
    } else {
        while let line = aStreamReader.nextLine() {
            if countElements(line) == 0 {
                break
            }
            dataStr += line + "\n"
        }
    }
    aStreamReader.close()
    println(dataStr)
} else {
    println("cannot open file")
}
like image 122
Martin R Avatar answered Sep 22 '22 08:09

Martin R