🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

800閲覧

文字列操作に関する質問

takeshi1907

総合スコア54

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2020/12/15 05:50

編集2020/12/16 01:34

空白の列を左に埋めるプログラムを作っています。

そこで、下記の様な文字列があったとします。
左から4番目の「d」に当たる縦の1列の文字列(カンマ)を削除したいと考えています。

縦一列全てカンマの場合削除したいので、列は複数の場合もあります。

どの様なコードを書けば実現できるでしょうか?

var str = " A , , , e , , \n A b , , , f g \n , b c , e , g \n A b , , e f g \n "

↓期待する結果

var str = " A , , e , , \n A b , , f g \n , b c e , g \n A b , e f g \n "

追記: 例題をわかりやすくする為にアルファベットを使用していますが、アルファベットの部分はランダムに文字が入ります。
要は何も文字が入っていない列を削除したいと思っています。

文字列を一度配列にして、空の配列を削除するなどでできそうなのが、具体的なコードのイメージができていません。

考えても思いつかなかった為ご質問しました。

よろしくお願いします。

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

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

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

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

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

MasakiHori

2020/12/15 08:09

質問とは関係ありませんが、CSVを自力でパースするのは素人にできるものではありません。 信頼できるCSVパーサを利用してください。 (私はCSVは危険すぎるのでCSVは扱いません。ですので信頼できるCSVパーサを知りません) また「Swift CSV」で検索してみましたが正しくパースを行っている記事は皆無でしたので、日本語で書かれたSwiftでのCSVのパースに関する記事はすべて誤りだと思ってください。 ただしご自身が制限されたCSVの仕様を用意しその仕様のCSVしか扱わないのであれば危険性を認識した上でその仕様に合致したCSVを利用するのは問題ないと思います。
takeshi1907

2020/12/15 08:18 編集

コメントありがとうございます。 認識が足りていなく申し訳無いのですが、CSVが危険というのはどういった意味で危険なのでしょうか。 現在は単純にカンマで区切ったデータをCSVファイルとして書き出しを行っているだけとなります。 よろしくお願いいたします。
MasakiHori

2020/12/15 09:21

例えば "a", "b, c, d\ne, f", g このような内容のCSVがあった場合 "a" | "b | c | d [改行] e | f" | g とパースするのは誤りで a | b, c, d\ne, f | g とパースしなければなりません。(|をセパレータとして表記しています) "で囲まれた文字列には,および改行を含めることが可能です。 またCSVには様々な亜種が存在あり、CSVを作成する人のほとんどは自分の知っている書式が正しいCSVだと信じています。 そのためあるCSVは扱えるのに別のCSVは扱えないという問題が発生することがしばしばあります。 パースの難しさ、独自に拡張されるなど互換性のない多種にわたる仕様がCSVの危険性です
takeshi1907

2020/12/16 01:16

内容の方を理解しました。 ありがとうございます。
takeshi1907

2020/12/16 01:38

誤解を招きそうなので、CSVという表現は質問内から削除させていただきました。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

単純に最初に思いつくのは各列の文字を1字ずつ順番に格納していって、最後まで格納し終わったときに全て空白のものを見つけて、それ以外を結合しなおして文字列を作り直せば良いのではないでしょうか。(もっと良い方法はありそうですがシンプルに考えると)

===コメントへの回答追記

今Xcodeの再インストール中でオンラインで打てるSwiftで打ったコードなので正しいのかわからないのと、結構適当に書いたので諸々あれですが、処理の流れの参考にだけ。

var array:Array<Array<String>> = [[],[],[],[],[],[],[],[]] var str = "A,,,e,,\nAb,,,fg\n,bc,e,g\nAb,,efg\n" var count = 0 for c in str { array[count].append(String(c)) count += 1 if(c == "\n"){ count = 0 } } var newArray:Array<Array<String>> = [] for ar in array { var delFlg = true for a in ar { if(a != ","){ delFlg = false } } if(!delFlg){ newArray.append(ar) } } var newStr = "" var count2 = 0 for i in 0...3 { for newA in newArray { newStr += newA[count2] } count2 += 1 } print(newStr)

==== 回答追記
カンマまでを文字列としたときのサンプル。あくまでサンプルなので〜省略

var array:Array<Array<String>> = [[],[],[],[],[],[]] let str = "こんにちわ,,おはよう,,お疲れ様\nこんにちわ,また明日,,,お疲れ様\n" var count = 0 var inputStr = "" print(str) for c in str { if(c == "\n"){ array[count].append(inputStr) array[count+1].append("\n") count = 0 inputStr = "" continue } if(c == ","){ array[count].append(inputStr) inputStr = "" count += 1 }else{ inputStr += String(c) } } print(array) var newArray:Array<Array<String>> = [] for ar in array { var delFlg = true for a in ar { if(a != ""){ delFlg = false } } if(!delFlg){ newArray.append(ar) } } print(newArray) var newStr = "" for i in 0...1 { var flg = false for newA in newArray { if(newA[i] != "\n" && flg){ newStr += "," } flg = true newStr += newA[i] } } print(newStr)

投稿2020/12/16 01:25

編集2020/12/16 04:58
razuma

総合スコア1313

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

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

takeshi1907

2020/12/16 01:36

どうもありがとうございます。 配列は考えたのですが、具体的なイメージがつかず、、簡単で良いのでサンプルコードがあるとイメージがつきやすいかもしれません。
razuma

2020/12/16 02:44

一応コード書いておきました。諸々あれなのでイメージの参考にだけ。
takeshi1907

2020/12/16 02:51

わざわざコードの方、ありがとうございます。 参考にさせていただきます。 サンプルを元に一旦試してみたいと思います。
razuma

2020/12/16 02:56

はい。うまくいかなかったり、不明点等あればまたコメントください。
takeshi1907

2020/12/16 03:32 編集

試してみました。正常に動く様で大変感謝いたします。 また、私の質問が大変わかりにくくて申し訳なかったのですが、例題をわかりやすくする為にアルファベットを使用したのですが、正確にはカンマ区切りで、下記の様に複数文字が入るのですが、この場合サンプルコードだと例えば「こんにちわ」の文字列も固まりではなく、一文字づつ拾ってしまいます。 この場合はどの様にしたら良いでしょうか。 ------------------------------------------- こんにちわ,,おはよう,お疲れ様\n こんにちわ,また明日,,お疲れ様\n ------------------------------------------- 現在、str.components(separatedBy: ",")で文字列を一度配列にしたりと試しています。 よろしくお願いいたします。
razuma

2020/12/16 03:35

カンマがくるまでを文字列として格納していく感じになるかなと思います。 カンマが連続で来る場合は空文字を配列に入れるようにして空文字のみの配列を削除するような感じでどうでしょうか。(できなさそうであればサンプルコードに付け足して書いてみます)
takeshi1907

2020/12/16 04:15 編集

ご丁寧に、どうもありがとうございます。 試してみようと思います。
takeshi1907

2020/12/16 04:17

>(できなさそうであればサンプルコードに付け足して書いてみます) 思うようにうまくいかず、、もしよろしければお願いすることは可能でしょうか。
razuma

2020/12/16 04:59 編集

サンプルコード追記しました。諸々あれなので参考にだけ〜。 空文字だけの列を作るためにサンプルの文字列を "こんにちわ,,おはよう,,お疲れ様\nこんにちわ,また明日,,,お疲れ様\n" としています。 うまくいかなかったり、不明点等あればまたコメントください。
takeshi1907

2020/12/16 06:52 編集

お世話になっています。 頂きましたサンプルコードを駆使した所、やりたいことが実現できました! この度は、本当にありがとうございました。
razuma

2020/12/16 07:01

無事に実現できて良かったです。開発がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問