2024年9月29日日曜日

Arduinoで使える文字列の分割結果取得関数getBySplitを作った


背景

Arduinoにはjsのsplit関数のような文字列を特定の文字で分割する関数が提供されていません。
使いたい場面があったので、似たような使い方をできるgetBySplitを作ってライブラリに含めて公開しました。
使いたい方が居ると思うので、ライブラリの設定方法と関数の呼び方を記事で紹介します。

使ったもの

Arduino環境
ArdinoのStrring型が呼べて、ライブラリをダウンロードできれば良いため、Arduino IDEでもPlatformIOでも良いです。

ライブラリstring_asukiaaaを設定

今回作ったgetBySplit関数はライブラリstring_asukiaaaの一部として公開したので、それを呼ぶためにArduino環境に設定します。

Arduino IDEの場合はライブラリマネージャからstring_asukiaaaをダウンロードしてください。

PlatformIOの場合はplatformio.iniのlib_deps設定にstring_asukiaaaを記述してください。

string_asukiaaaのversion1.0.5以上で利用可能です。

getBySplitの実行例

第1引数に分割対象、第2引数に分割文字、第3引数に分割後の先頭からの順番を渡して使います。
#include <string_asukiaaa.h>

String strToSplit = "asukiaaa.blogspot.com";
String strFirst = string_asukiaaa::getBySplit(strToSplit, ".", 0); // "asukiaaa"
String strSecond = string_asukiaaa::getBySplit(strToSplit, ".", 1); // "blogspot"
String strThird = string_asukiaaa::getBySplit(strToSplit, ".", 2); // "com"
String strForth = string_asukiaaa::getBySplit(strToSplit, ".", 3); // ""

順番を渡して該当するものがあれば戻り値として返すことで、vector型が標準では提供されてないArduino環境でも使いやすくしています。

getBySplitの実装内容

記事を書いている時点での実装はこちらです。
githubにも上げています。
String getBySplit(const String str, String wordSplit, uint16_t index) {
uint16_t indexPrevStart = 0;
for (uint16_t i = 0; i < index + 1; ++i) {
auto wordSplitIndex = str.indexOf(wordSplit, indexPrevStart);
if (i == index) {
return str.substring(indexPrevStart,
wordSplitIndex < 0 ? str.length() : wordSplitIndex);
}
if (wordSplitIndex < 0) {
return "";
}
indexPrevStart = wordSplitIndex + wordSplit.length();
}
return "";
}
IndexOfsubstringを利用して実現しています。

おわり

文字列処理のsplitにと同等のgetBySplit関数を作ったので使い方を紹介しました。
良かったらご利用ください。

参考

asukiaaa/arduino-string (string_asukiaaa)
IndexOf - Arduino Reference
substring() - Arduino Reference

0 件のコメント :