質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

3回答

1373閲覧

テキストベースの辞書から変換する方法がわからない

Nicola

総合スコア21

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2015/07/29 02:16

編集2015/07/29 02:29

以下のようなテキストファイルから、ひらがなの入力文字から、特定の行を選択していくいい方法がありませんか?
テキストではなく、データベース化しないとダメでしょうか?

辞書の一部です。
あいしてます 829 231 6826 あいしてます
あいすてーしょん 1866 1773 8007 愛ステーション
あいすと 1773 262 5711 アイスと
あいすと 1773 359 6287 アイスと
あいすと 1773 375 6655 アイスと
あいそれ 1773 1829 7426 あいそれ

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nicola

2015/07/29 02:57

1ファイル8M以上のファイル×10個になります。やはり、動作やメモリーを考えたら、データベース化するのが現実的でしょうか?
rifuch

2015/07/29 03:45

メモリーのことはもちろんですが、検索などもデータベースのクエリを使った方が高速かつ効率的でしょう。 データベースを使えば、インデックスの張り方やクエリの書き方次第で高速化や効率化は可能です。 自前で検索のアルゴリズムを実装するのは、勉強にはなってもあまり現実的とはいえません。(うまくすればデータベースよりも高速に動作させられそうですが)
Nicola

2015/07/31 00:22

サンプルコードまでありがとうございます。 しかし、"/path/to/data.txt"のところがエラーで使えませんでした。 初心者なもので、このエラーの解決に未だ時間が割かれています••• String in not convertible to 'StringLiteralConvertible' はたして? すみません。
rifuch

2015/07/31 00:46

contentsOfFileで渡しているパスは正しく読み込むファイルを指していますか? 読み込むファイルのエンコードはあっていますか? 上記2点を確認してみてください。 ファイルのパスは、配置するところで変わってしまうので、NSSearchPathForDirectoriesInDomains等で検索してセットする方が良いかもしれません。 読みこみファイルのエンコードは、サンプルではUTF8なので、違っている場合はそれ合わせて変更してください。
rifuch

2015/07/31 00:56

データベースを使用するのであれば、 事前にSQLite等のデータベースファイルを作成してしまって、 それをアプリでインポートする方が、 iOSアプリ内でテキストを読み込んでDBに格納するよりも手軽にすむかと思います。 (データ更新方法によっては、アプリ内でDBに格納する方が良いときもありますが) タブ区切りテキストをSQLiteデータベースに変換する方法はここが参考になるかと。 http://www.dbonline.jp/sqlite/manage/index2.html
Nicola

2015/07/31 07:19

色々調べた結果、以下のソースになっていますが、正しく動作しません。 let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String let fileName = "dictionary00.txt" let data = NSString(contentsOfFile: "\(documentsPath)+\(fileName)" , encoding: NSUTF8StringEncoding, error: nil) で、3行目でViewController.Type dose not have a member named documentsPathエラーになってしまいます。 ファイルも形式もあっているはずです。 お忙しいところすみませんが、アドバイスいただけないでしょうか。 よろしくお願いいたします。
rifuch

2015/07/31 07:55

swiftあんまり得意じゃないので自信が無いですが エラーとしては、documentsPathが認識できないようなエラーのようですが。 let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let filePath = paths[0].stringByAppendingPathComponent("dictionary00.txt") let data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil) で行けませんか?
rifuch

2015/07/31 07:58

realmは最近出てきたやつで、SQLiteよりもずっと良いようです。 残念ながら私は使う機会が無くて、まだ勉強していませんが、新しく学ぶのならそちらの方がいいと思います。
guest

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

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

タブ区切りのテキストファイル(TSV)から特定の文字列で検索したいだけなら、awkコマンドのワンライナーで簡単かつ高速に検索することが出来ます。
データをメモリーに常駐させる必要もありませんし、何も考えずにDB化する位なら遜色のない速度で検索可能です。

DB化すべきかどうかは、むしろ検索結果をどの様に利用するか、そして今後データをどの様にメンテナンスして行くかによって決まって来ます。

MySQLのようなRDBSを利用するメリットは
①ロック機構による排他制御がし易い
②トランザクション制御がし易い
③テーブルを正規化し、制約やリレーションを定義しておけば、データの整合性を担保し易い
などです。

データのreadとwriteのプロセスが同時に処理される可能性があるとか、ひとまとまりの処理が完全に成功した場合のみデータを更新したいとか、データ項目間に何らかの関連や制約があって整合性を保ったまま更新するためにデータの検査が必要ならば是非ともDB化してください。

一方、単純に行単位のデータ追加があるだけの辞書から、手際良く該当の行を選択したいだけならば、awkのワンライナーがオススメです。
結構複雑な検索条件にも簡単に対応できます。

投稿2015/07/30 00:26

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nicola

2015/07/30 04:06

Googleさんで調べてみているんですが、AWKコマンドはあまり情報がありません(調べ方が悪いのか?) SwiftでiOSソフトの中に組み込んで使えるんですか? 見つけたのが、コマンドラインでの使用法だったので… やっぱり、DBなんでしょうか?
pi-chan

2015/08/01 08:36

「SwiftでiOSソフトの中に組み込んで使えるんですか?」 ⇒ 使えますよ!ちょっと長くなるので、別途参考情報を回答します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問