以下のようなテキストファイルから、ひらがなの入力文字から、特定の行を選択していくいい方法がありませんか?
テキストではなく、データベース化しないとダメでしょうか?
辞書の一部です。
あいしてます 829 231 6826 あいしてます
あいすてーしょん 1866 1773 8007 愛ステーション
あいすと 1773 262 5711 アイスと
あいすと 1773 359 6287 アイスと
あいすと 1773 375 6655 アイスと
あいそれ 1773 1829 7426 あいそれ
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
タブ区切りテキストのようですから、CSVをパースする要領で配列に変換することはできます。
swift
1let data = NSString(contentsOfFile: "/path/to/data.txt", encoding: NSUTF8StringEncoding, error: nil) as String 2data.enumerateLines { (line, stop) -> () in 3 println(line) 4 println(split(line,{ $0 == "\t"})) 5}
ただし、これではメモリに常駐させる必要がある上、検索なども自分で実装する必要があります。
(検索効率を考えて、配列以外のデータに格納するなど)
単純にテキストを検索するなどの方法を採りたいのであれば、
テキストをデータベースに格納して、
データベースにすでにある機能を活用するのが一番の近道だと思います。
投稿2015/07/29 02:34
総合スコア1901
0
回答が遅くなりましたが、たとえばこんな方法で。
流れとしては、辞書検索は外部のコマンドに任せ、swift側では結果だけを取得して後続処理をするという感じです。
【準備1】awk を使った辞書検索
①辞書を適当なディレクトリ配下に配置します。たとえば以下のように複数ファイルに分かれて存在するとして、
/usr/local/dic/dic_{連番}.txt
たとえば以下のような感じで。
===[ /usr/local/dic/dic_01.txt ]=========== あいしてます 829 231 6826 あいしてます あいすてーしょん 1866 1773 8007 愛ステーション あいすと 1773 262 5711 アイスと あいすと 1773 359 6287 アイスと ===[ /usr/local/dic/dic_02.txt ]=========== あいすと 1773 375 6655 アイスと あいそれ 1773 1829 7426 あいそれ
こうしておくと、awk のワンライナーで以下のように検索できます。
(キーワードの完全一致でも検索できますが、下記の例では前方一致の例を示してあります)
$ /usr/local/bin/gawk -F'\t' -v k='^あいす' '$1 ~ k' /usr/local/dic/dic_*.txt あいすてーしょん 1866 1773 8007 愛ステーション あいすと 1773 262 5711 アイスと あいすと 1773 359 6287 アイスと あいすと 1773 375 6655 アイスと $ $ /usr/local/bin/gawk -F'\t' -v k='^あいすて' '$1 ~ k' /usr/local/dic/dic_*.txt あいすてーしょん 1866 1773 8007 愛ステーション $
この方式だと、辞書ファイル(テキストファイル)が後からいくつ追加されてもOKです。
【準備2】swift から呼び出しやすいようにスクリプト化
swift側の記述が楽なように、awkのワンライナーをスクリプト化しておきます。
忘れずに実行権を付けておいてください。
/usr/local/dic/search_dic.sh
bash
1#!/bin/bash 2/usr/local/bin/gawk -F'\t' -v k="^$1" '$1 ~ k' /usr/local/dic/dic_*.txt
【swiftからの呼び出し】
いよいよ、swift側から呼び出します。
swift
1import Foundation 2 3var keyword : String = "あいすと" 4var cmd : String = "/usr/local/dic/search_dic.sh" 5 6var task:NSTask = NSTask() 7task.launchPath = cmd 8task.arguments = [keyword] 9var pipe:NSPipe = NSPipe() 10task.standardOutput = pipe 11task.launch() 12var output:NSData = pipe.fileHandleForReading.readDataToEndOfFile() 13var outputStr:NSString = NSString(data:output,encoding:NSUTF8StringEncoding)! 14 15println(outputStr)
そうすると、コマンドラインでのスクリプト実行結果が文字列として取得されます。
あいすと 1773 262 5711 アイスと
あいすと 1773 359 6287 アイスと
あいすと 1773 375 6655 アイスと
あとは処理したい内容に応じて、取得した結果(文字列)を配列に突っ込むなどして、好きなように料理してください。
ただし、こうして得られた「結果」を、他のスレッドでご質問のようにiOSで運用しようとお考えならば、素直にモバイル向けのDBをご使用になられた方が楽ですね。。。
最近では Realm
が注目されているようですが。
投稿2015/08/01 08:56
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
タブ区切りのテキストファイル(TSV)から特定の文字列で検索したいだけなら、awkコマンドのワンライナーで簡単かつ高速に検索することが出来ます。
データをメモリーに常駐させる必要もありませんし、何も考えずにDB化する位なら遜色のない速度で検索可能です。
DB化すべきかどうかは、むしろ検索結果をどの様に利用するか、そして今後データをどの様にメンテナンスして行くかによって決まって来ます。
MySQLのようなRDBSを利用するメリットは
①ロック機構による排他制御がし易い
②トランザクション制御がし易い
③テーブルを正規化し、制約やリレーションを定義しておけば、データの整合性を担保し易い
などです。
データのreadとwriteのプロセスが同時に処理される可能性があるとか、ひとまとまりの処理が完全に成功した場合のみデータを更新したいとか、データ項目間に何らかの関連や制約があって整合性を保ったまま更新するためにデータの検査が必要ならば是非ともDB化してください。
一方、単純に行単位のデータ追加があるだけの辞書から、手際良く該当の行を選択したいだけならば、awkのワンライナーがオススメです。
結構複雑な検索条件にも簡単に対応できます。
投稿2015/07/30 00:26
総合スコア5936
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/29 02:57
2015/07/29 03:45
2015/07/31 00:22
2015/07/31 00:46
2015/07/31 00:56
2015/07/31 07:19
2015/07/31 07:32
2015/07/31 07:55
2015/07/31 07:58