106967
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオン
動作不具合での質問の場合には環境を表記(OS,バージョン等)
タイトルは内容を表し、内容はネットゲーム関係禁止
自身でコードを書く気の無いナマケモノは特に質問禁止
失敗作でもコードを投稿すること(具体性の無い質問は無視される可能性大)

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
環境設定[s7777777]

(No Subject) / Nox
MOUSEORGでウィンドウIDを指定し、KBD関数を使ってAndroidエミュを操作していたのですが、エミュのバージョンを上げたらKBDを受け取らなくなってしまいました。
ACWにするときちんとKBDを実行し動作しました。
何が原因でしょうか?

No.1606 2023/07/18(Tue) 22:23:06

Re: / stuncloud
MORG_DIRECTを使っていたということですか?
(mouseorg(id, 2)という書き方をしている場合も該当します)

MORG_DIRECTの場合はおそらくキー送信に該当するメッセージをPostMessage等で直接送信しているので、対象ウィンドウ側でそのメッセージを処理していなければ動作しません
バージョンアップに伴い該当メッセージを処理しなくなったのが原因ではないでしょうか

> ACWにすると
というのは意味がわかりませんがMORG_DIRECTでなければおそらくSendInput等でキー送信が行われるため正常に動作するのだと思います

MORG_DIRECTが使えるかどうかは対象ウィンドウ次第なので動かない場合は使うことを諦めましょう

No.1607 2023/07/18(Tue) 23:25:18

Re: / Nox
お返事ありがとうございます。

そうです!mouseorg(id, 2)でコードを書いてます。

idについてなのですが、エミュをemu1、emu2、emu3、のように3つ起動しているのですが、
mouseorg(GETID("emu1"), 2)と記載するとKBDが機能せず、
mouseorg(GETID("emu"), 2)と記載すると3のうち一つだけKBDが機能して反応してくれます。
この場合でもPostMessage?は対応していないのでしょうか?
また、ランダムに1つだけ反応するのはなぜでしょうか?

ACW(GETID("emu1"))やctrlwin(GETID("emu1"), ACTIVATE)はきちんとKBD反応しました。

No.1608 2023/07/19(Wed) 01:52:25

Re: / stuncloud
> ランダムに1つだけ反応するのはなぜでしょうか?
getidのウィンドウタイトル指定は部分一致なので1〜3いずれかのIDが取れてるのでしょう
> この場合でもPostMessage?は対応していないのでしょうか?
それでkbdが使える理由はわかりませんが、そこに解決の糸口があるかもしれんですね
emu = getid("emu")
emu1 = getid("emu1")
emu2 = getid("emu2")
emu3 = getid("emu3")
とやってstatusやidtohndで違いを調べてみては?

メッセージが処理されるかどうかは対象ウィンドウ次第と書きましたがウィンドウというのは何もトップレベルだけに限らないんですよね
第1引数にウィンドウIDだけでなくHWNDも渡せるんですけど、これはgetctlhndと併用してメッセージが処理できる子ウィンドウに対して直接キー情報を送信することもできるということです
そのような子ウィンドウが見つかれば希望通りMORG_DIRECTができるでしょうからがんばって探してみてください
子ウィンドウはgetallwin(id)を使うことで網羅できます

> ACW(GETID("emu1"))やctrlwin(GETID("emu1"), ACTIVATE)はきちんとKBD反応しました。
これの意味が全くわかんないんですが、acwやctrlwinをしとけばMORG_DIRECTが効くようになったという話?ですか???
ならそれをやればいいんじゃ????

No.1609 2023/07/19(Wed) 08:30:24

Re: / Nox
> emu = getid("emu")
> emu1 = getid("emu1")
> emu2 = getid("emu2")
> emu3 = getid("emu3")
> とやってstatusやidtohndで違いを調べてみては?

IDTOHND(GETID("emu"))を各々してPrintした所、すべて別の数字の羅列が返ってきました。

> 第1引数にウィンドウIDだけでなくHWNDも渡せるんですけど、これはgetctlhndと併用してメッセージが処理できる子ウィンドウに対して直接キー情報を送信することもできるということです
HWNDというのは先ほどの数字の羅列でしょうか?

> 子ウィンドウはgetallwin(id)を使うことで網羅できます
getallwinでそれらしい物として、sub,subWinというものがあったのですが、説明して下さっているコードの書き方が分からず、書き方を教えて頂きたいです。

> これの意味が全くわかんないんですが、acwやctrlwinをしとけばMORG_DIRECTが効くようになったという話?ですか???
> ならそれをやればいいんじゃ????

出来ればバックグラウンドで処理したいので、アクティブにして処理するのは避けたいのです。

No.1610 2023/07/19(Wed) 14:29:18

Re: / stuncloud
acw云々はフォアグラウンドで通常のkbdって話だったんですね

> 書き方を教えて頂きたいです。
けっこうヒントはあったと思うのですが…

getallwin(id)で子ウィンドウのidが取れるということは、それらの子idを使ってmouseorg(子id, MORG_DIRECT)が試せるということです
で、kbdができる子ウィンドウがもし見つかればstatus(子id, ST_CLASS)でそいつのクラス名がわかるわけです
それを行う調査用スクリプトを別に書きましょう

そしてその調査でクラス名が得られたならば、あとは本番スクリプトでそのクラス名を使いgetctlhndでウィンドウハンドル(HWND)を取得しmouseorgすれば良い、という話です

というわけでがんばってみてくださいね!

No.1611 2023/07/19(Wed) 17:34:49

Re: / Nox
Nox,Qt5QWindowIconのように同一名のIDが複数返ってきた場合、IDを個別に指定する方法などありますか?
同じものが33個ほどあります。

No.1612 2023/07/20(Thu) 15:33:26

Re: / stuncloud
ヘルプを読め
No.1613 2023/07/20(Thu) 17:55:29
変数値の納め直し(?) / 太田
小池="東京"
黒岩="神奈川"
青島="東京"
鈴木="北海道"

という変数値があるとして、これを逆に

東京="小池,青島"
北海道="鈴木"
神奈川="黒岩"

と納め直すにはどのようにすれば手っ取り早いでしょうか。

No.1602 2023/07/05(Wed) 18:56:53

Re: 変数値の納め直し(?) / 太田
47都道府県の変数は最初から用意されてるものとします。
No.1603 2023/07/05(Wed) 19:34:22

Re: 変数値の納め直し(?) / stuncloud
まずUWSCでは変数名を文字列として評価するすべがないので、プログラム的にそれをやるのは無理です
なので、元々文字列であるものを変数のように扱うのが良いでしょう
具体的には連想配列です

hashtbl 名字

名字["小池"]="東京"
名字["黒岩"]="神奈川"
名字["青島"]="東京"
名字["鈴木"]="北海道"

「名字」という連想配列を作り、そのキーとして小池などの名字を指定し、値として都道府県名を入れておきます
このあと名字と都道府県名の関係を入れ替える処理を行いますが、新たな連想配列を作ることでそれも実現できそうです
この連想配列は都道府県をキーとし、値をカンマ区切りの名字にします

hashtbl 都道府県

for name in 名字
 pref = 名字[name] // 名字から都道府県名を得る
 if 都道府県[pref, HASH_EXISTS] then
  都道府県[pref] = 都道府県[pref] + "," + name
 else
  都道府県[pref] = name
 endif
next

このようなコードを書くことで、

print 都道府県["東京"] // 小池,青島

という結果が得られる連想配列が出来上がるはずです
※ コードはおおよそ合ってるはず…ですが動作検証をしておらず書き間違いにより動かないということがあるかもしれません、そのような場合はご容赦ください
  コードの流れや雰囲気は伝わると思います

No.1604 2023/07/05(Wed) 20:18:25

Re: 変数値の納め直し(?) / 太田
stuncloudさん、早速にありがとうございます。
ご教示いただきましたスクリプトで、あっさり、しっかり、結果が出ました。
連想配列は手を出したことがなかったので、コードを見て勉強させていただきます。
本当にありがとうございました!

No.1605 2023/07/05(Wed) 23:38:16
virustotalのアップロードボタンが選択/押下できない / TS
driver.Navigate("https://www.virustotal.com/gui/home/upload")

textblock js
return document
.querySelector('vt-ui-shell').shadowRoot
.querySelector('home-view').shadowRoot
.querySelector('vt-ui-main-upload-form').shadowRoot
endtextblock

shadow_root = driver.ExecuteScript(js)

Choose_file_btn = shadow_root.FindElement( By.Tag("button") + By.Id("infoIcon"))
Choose_file_btn.Click()
-------------------------------------------------
driver.FindElement( By.Tag("button") + By.Id("infoIcon"))で取得できなかったため、以下のサイトを参考に上記のコードを作成しましたが、変わらず取得できません
UwscWebDriverの開発が終了した状況で恐縮ですが、アドバイスいただけますと嬉しいです。よろしくお願いいたします。

https://stackoverflow.com/questions/59345959/how-to-pass-the-value-in-search-on-url-https-www-virustotal-com-gui-home-searc

No.1598 2023/06/25(Sun) 15:57:42

Re: virustotalのアップロードボタンが選択/押下できない / stuncloud
さすがにShadow DOMとなると動作しなくても不思議じゃないですね
とはいえブラウザ内でなら触れるはずなのでクリックまでJavaScriptで書けば良いんじゃないでしょうか
UwscWebDriverの機能でできないならJavaScriptでやればいいんですよ
それでだいたい解決します

#JavaScriptの書き方は聞かれても答えませんよ

No.1599 2023/06/25(Sun) 20:54:26

Re: virustotalのアップロードボタンが選択/押下できない / stuncloud
// UWSCRでやってみたら普通にクリックできました
// こっちはほぼ生のJavaScript叩いてるようなものなので

chrome = BrowserControl(BC_CHROME)
ctrlwin(chrome.id(), ACTIVATE)

tab = chrome[0]
tab.navigate("https://www.virustotal.com/gui/home/upload")

infoIcon = tab.document _
 .querySelector('vt-ui-shell') _
 .querySelector('home-view').shadowRoot _
 .querySelector('vt-ui-main-upload-form').shadowRoot _
 .querySelector('button#infoIcon')

infoIcon.click() // Choose fileボタンをクリック


// それはそうと元スクリプトのJavaScriptがそもそも間違ってるんですよね
// そこを直せば動くのかな

No.1600 2023/06/25(Sun) 22:16:49

Re: virustotalのアップロードボタンが選択/押下できない / TS
ご説明/アドバイスありがとうございました
以下のように修正し、押下できるようになりました

textblock js_infoIcon
return document
.querySelector('vt-ui-shell')
.querySelector('home-view').shadowRoot
.querySelector('vt-ui-main-upload-form').shadowRoot
.querySelector('button#infoIcon')
endtextblock

Choose_file_btn = driver.ExecuteScript(js_infoIcon)
Choose_file_btn.Click()

UWACRは「プロシージャエントリ ポイント SetProcess Dpi Awareness Context がダイナミック リンクライブラリ user32.dll から見つかりませんでした。」と表示され起動できないので、環境を整備した上で試してみます

No.1601 2023/06/26(Mon) 15:07:00
あるサイトのラジオボタンが選択できない / TS
<p class="fm-form-row" data-direction="radio-vertical">
<!--?lit$720000316$--><!----><label class="fm-holder of-label">
<input type="radio" name="qa1" value="1">
<span class="_text"><!--?lit$720000316$-->過去利用したことがある</span>
</label><!----><!----><label class="fm-holder of-label">
<input type="radio" name="qa1" value="2">
<span class="_text"><!--?lit$720000316$-->現在利用している</span>
</label><!----><!----><label class="fm-holder of-label">
<input type="radio" name="qa1" value="3">
<span class="_text"><!--?lit$720000316$-->利用を検討している</span>
</label><!----><!----><label class="fm-holder of-label">
<input type="radio" name="qa1" value="4">
<span class="_text"><!--?lit$720000316$-->一度も利用・検討したことがない</span>
</label><!---->
</p>

上記のラジオボタン(value="1")を選択したいのですが、driver.FindElement( By.Tag("input") + By.Attribute("type", "radio") + By.Attribute("name", "qa1") + By.Attribute("value", "1") ) .Click()で選択できません。
どのようにすればよいかアドバイス、よろしくお願いいたします。

UWSCWebDriver 0.11.0

No.1595 2023/06/19(Mon) 20:48:14

Re: あるサイトのラジオボタンが選択できない / とおりすがり
By.Attribute("value", "1") ) .Click()

↑上記の .Click()前のスペースが不要なのではないですか?

No.1596 2023/06/20(Tue) 15:14:49

Re: あるサイトのラジオボタンが選択できない / TS
自己レスとなりますが、<span class="_text">を取得しクリックすることでラジオボタンを選択できました。
大変失礼いたしました。

No.1597 2023/06/20(Tue) 16:09:51
UWSC Pro版のダウンロードについて。 / haku
UWSC Pro版のダウンロードについて。
UWSC Proユーザーです。
シリアルは控えていたのですが、ファイルを控えていませんでした。
ダウンロード先をご存じの方がおられましたらリンクをヨロシクです。

No.1594 2023/06/16(Fri) 23:15:05
UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / マルパ
Chrome操作でUwscWebDriverにいつもお世話になっています、ご提供ありがとうございます

現在、自分のプロファイルを使ってChromeを操作しようとする場合にうまくいきません(プロファイルを使わなければ問題なく使用できます)
同じ自分のプロファイルをCREATEOLEOBJ("Selenium.WebDriver")を使った方法では問題なく動きます


UwscWebDriverの使用には
stuncloud様のgithubのページ
https://github.com/stuncloud/UwscWebDriver/wiki/Chrome%E3%81%A7%E8%87%AA%E5%88%86%E3%81%AE%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86
を参考にしました

作成し実行したコードは次の通りです


opt = WebDriver.Option("chrome")
opt.args.add("--user-data-dir=C:\\Users\\" + ユーザーネーム + "\\AppData\\Local\\Google\\Chrome\\User Data")
opt.args.add("--profile-directory=プロファイル名")

driver = WebDriver.Chrome(9515, opt)
driver.Navigate(URL) // URLは任意のURLアドレス


このコードを実行するとプロンプトの画面が表示されます
画面の内容は

Starting ChromeDriver 104.0.5112.79 (3cf3e8c8a07d104b9e1260c910efb8f383285dc5-refs/branch-heads/5112@{#1307}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

DevTools listening on ws://127.0.0.1:51282/devtools/browser/7ea2d773-3e8e-45ce-9be3-c9c8f812b371

です



そしてChromeのウィンドウが表示されます(指定したプロファイルでウィンドウが表示されています)
直後にUWSCのエラーメッセージが表示されます
メッセージは

COM_Error:Could not convert variant of type (Null) into type (Dispatch)
XXX行目:IE.Navigate(URL)

です


UwscWebDriverの開発は終了したと存じておりますが、アドバイスいただけますでしょうか?

No.1589 2023/06/16(Fri) 07:47:09

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / stuncloud
原因はエラーメッセージの通りです
> COM_Error:Could not convert variant of type (Null) into type (Dispatch)
> XXX行目:IE.Navigate(URL)

変数IEがNULLだからです

No.1590 2023/06/16(Fri) 09:31:11

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / マルパ
返答ありがとうございます

com エラーの表記間違っていました

XXX行目:IE.Navigate(URL) ではなく

XXX行目:driver.Navigate(URL) でした



driver = WebDriver.Chrome(9515, opt)
この部分がなぜかうまくいっていないということでしょうか

No.1591 2023/06/16(Fri) 19:12:22

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / stuncloud
> driver = WebDriver.Chrome(9515, opt)
> この部分がなぜかうまくいっていないということでしょうか

そうですね、関数失敗時はNULLを返します
ただその場合は警告を表示するようになってるはずなので、まずはUwscWebDriverを最新版にしてください
その上で警告の表示に従い原因の切り分けを行ってください

No.1592 2023/06/16(Fri) 20:28:11

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / マルパ
アドバイスありがとうございます

UWSCWebDriverを最新にして使ったところ警告が出るようになりました

表示に従った結果

すでにChromeが起動している場合(別のプロファイルのもの)にはエラーがでますが
Chromeを起動していない状態で実行するとエラーはでなくなりました!、
ありがとうございます


プロファイルを使用しない場合にはすでにChromeが起動していてもエラーは出ないのですが、プロファイルを使う場合にはChromeは起動していないことが条件なのかもしれませんね

No.1593 2023/06/16(Fri) 22:29:11
EXCELでSQLを使うには / みつ
お世話になります。

EXCEL2019のテーブルをデータベースにして、SQL接続を行おうとしたところ、
COM Error が出てしまいますので、どこがいけないか指摘をお願い致します。

EXCEL2019のマクロで動かすと問題なく動きます。


////////////////////////

Dim cn //コネクション
Dim rs //レコードセット

cn = CREATEOLEOBJ("ADODB.Connection")
rs = CREATEOLEOBJ("ADODB.Recordset")

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL.xlsm", 0)

cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties("Extended Properties") = "Excel 12.0" //← ここでCOM Error が出ます
cn.Open(GET_CUR_DIR + "\SQL.xlsm")


よろしくお願い致します。

No.1584 2023/05/16(Tue) 11:58:58

Re: EXCELでSQLを使うには / stuncloud
Propertiesの各アイテムにValueが生えてるのでそこに代入すれば良さそうです
これで動作するか確認してみてください

cn.Properties.Item("Extended Properties").Value = "Excel 12.0"
print cn.Properties.Item("Extended Properties").Value // Excel 12.0

No.1585 2023/05/16(Tue) 13:55:55

Re: EXCELでSQLを使うには / みつ
教えて頂いたコードで試しましたが同じエラーが出てしまいました。

////////////////////////

Dim cn //コネクション
Dim rs //レコードセット

cn = CREATEOLEOBJ("ADODB.Connection")
rs = CREATEOLEOBJ("ADODB.Recordset")

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL.xlsm", 0)

cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties.Item("Extended Properties").Value = "Excel 12.0" //← ここでCOM Error が出ます
print cn.Properties.Item("Extended Properties").Value // Excel 12.0
cn.Open(GET_CUR_DIR + "\SQL.xlsm")

No.1586 2023/05/16(Tue) 14:48:36

Re: EXCELでSQLを使うには / stuncloud
"Excel 12.0 Macro" ではどうですか?

参考: https://www.connectionstrings.com/ace-oledb-12-0/xlsm-files/

そもそもプロバイダ指定は正しいですか?
こちらもぜんぜんわかってないので的確な回答ができないんですよね
以下の記事が参考になったりしませんか?

https://qiita.com/yaju/items/7b0aa9e9f30005f60388

No.1587 2023/05/16(Tue) 17:02:00

Re: EXCELでSQLを使うには / みつ
教えて頂いたサイトを参考に無事動作させることができました。
ありがとうございました。

以下リンクからMicrosoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードし、インストールしたら動きました。

AccessDatabaseEngine.exe
<https://www.microsoft.com/ja-jp/download/details.aspx?id=13255>


////////////////////////

Dim cn //コネクション
Dim rs //レコードセット

cn = CREATEOLEOBJ("ADODB.Connection")
rs = CREATEOLEOBJ("ADODB.Recordset")

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL.xlsm", 0)

cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties("Extended Properties") = "Excel 12.0"
cn.Open(GET_CUR_DIR + "\SQL.xlsm")

rs.Open("SELECT * FROM [果物$] WHERE 種類 = 'りんご'", cn, 3 )
rs.RecordCount

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL貼り付け用.xlsx", 0)
EXCEL.ACTIVESHEET.RANGE("A2:XFD1048576").CLEAR
EXCEL.Sheets("Sheet1").RANGE("A2").CopyFromRecordset(rs)

rs.Close
rs = Nothing
cn.Close
cn = Nothing

No.1588 2023/05/18(Thu) 18:49:37
UWSCのReplace関数について。 / ほっしー
以下の文字列の3番目の文字をBBBに変えて
AAAAA=>AAABBBAAAにしたいのですが、VBAと違うのかうまくいきません。
他に良い方法がないかと思案しています。
基本的なこことはおもいますが、ご指南よろしくお願いいたします。

No.1582 2023/05/14(Sun) 01:26:23

Re: UWSCのReplace関数について。 / stuncloud
どのようなコードを書いてどうだめだったかをなるべく書くようにしてください
そこから読み取れることもあるので

> 以下の文字列の3番目の文字をBBBに変えてAAAAA=>AAABBBAAAにしたい
3番目のAをBBBにするとAABBBAAになると思われますが
AAABBBAAAになるとのことなので、要件も正確に書いてもらったほうが良いです

> VBAと違うのかうまくいきません
VBAであればどのように書いていたのかといった情報もあると良かったですね


とりあえずAAAAAをAABBBAAにする場合について考えてみましょう

やりたいことはn番目に出てくる特定の文字を別のものに置き換えるということですね
これはreplace関数だと難しそうなので、いくつかの関数を組み合わせてやることになります

まずそのn番目の文字の位置を特定する必要があります
これはpos関数でできそうです、3番目のAの位置を得るといったことができます

次に、置き換えたい文字の前後の文字列をコピーしておきます
1文字目から先程posで得た位置の前まで(前部分とします)、
そしてpos位置の次から最後まで(後部分とします)をそれぞれコピーします
これらはcopy関数でできますね

最後に 前部分 + 置き換える文字 + 後部分 と文字連結を行えば完了です
これらが正しく出来ていれば "AA" + "BBB" + "AA" となりAABBBAAが得られます
AAABBBAAAにしたい場合でもこの工程に少し変更を加えればできるはずです

No.1583 2023/05/15(Mon) 02:05:53
printウィンドウの表示について / OR
uwscのように、printウィンドウにprint出力(文字列)を表示したいと考えています。

以下のコードをエクスプローラからD&Dで実行しましたが、
灰色のウィンドウ(おそらくprintウィンドウ)が表示されるだけで、
その中に文字列が表示されません。
ログファイルには正しく出力されています。
uwscr -w test.uws で実行しても結果は同じでした。
未実装なのでしょうか?

[環境]
uwscr x64 ver0.10.0 (現在のlatest)
windows10 home

[コード]
logprint(true)
print "test"
sleep(5)

No.1579 2023/04/03(Mon) 11:10:23

Re: printウィンドウの表示について / stuncloud
確認します

追記
確認しました
実装はしてあるのですが何かが壊れているようです

print文を使う場合はコマンドプロンプトやPowerShellから
cmd /c uwscr hoge.uws
とすることでコンソール上に出力されるようになります
ご不便をおかけしますが修正までお待ち下さい

No.1580 2023/04/03(Mon) 11:29:54

Re: printウィンドウの表示について / stuncloud
print表示を修正した0.10.1をリリースしました
https://github.com/stuncloud/UWSCR/releases/tag/0.10.1

No.1581 2023/04/03(Mon) 14:01:12
CSV区切りのファイルを正しく区切って呼び出したい / けいち
お世話になります。
CSV区切りのファイルに

2023,3,1,"新規","20230215-0001",5,"箱No1,No2",1000

が保存されている時(実際は数万件あります)
たまに品名に半角カンマ「,」が含まれており品名は
ダブルクォーテーションで囲まれているのですが
数値などはダブルクォーテーションが付いていません。
SPLITを使うと品名まで分かれてしまいます。
1文字目で処理分けすると分けられるのですが件数が多い為に遅いです。
もう少しスッキリ早く終わるような方法はないでしょうか?
エクセルで開くと正しく読み込んでくれます(凄いですね)
以下コードです。

print "SPLITを使って区切りを,にした場合"
FID = fopen("data.csv",F_READ)
data = fget(FID,1)
FCLOSE(fid)
配列 = SPLIT(data,",")

for i = 0 to length(配列)-1
print 配列[i]
next

print "-------------------------------------"
print "1文字目で処理分けする"
data2 = data
while 0 < POS(",",data2)
//data2の一文字目が"
if "<#DBL>" = copy(data2,1,1) then
DBL = pos("<#DBL>",data2,2) //2個目の"を探す
print copy(data2,2,DBL-2)
data2 = copy(data2,DBL+2) //取得した分を消去

else
CAN = pos(",",data2) //,位置を探す
print copy(data2,1,CAN-1)
data2 = copy(data2,CAN+1) //取得した分を消去
endif
wend
print data2


-----結果-----
SPLITを使って区切りを,にした場合
2023
3
1
"新規"
"20230215-0001"
5
"箱No1
No2"
1000
-------------------------------------
1文字目で処理分けする
2023
3
1
新規
20230215-0001
5
箱No1,No2
1000

No.1576 2023/03/19(Sun) 04:46:19

Re: CSV区切りのファイルを正しく区切って呼び出したい / stuncloud
fgetがcsvに対応しているのでそれを使うのが一番簡単なのではないでしょうか

fid = fopen("data.csv", F_READ)
for i = 1 to fget(fid, F_LINECOUNT)
 col = 0
 while TRUE
  col = col + 1
  value = fget(fid, i, col) // 第三引数で列を指定
  if length(value) = 0 then
   // 値が空であればループを抜ける
   // このサンプルでは空の列があることを考慮していません
   break
  else
   print value
  endif
 wend
next
fclose(fid)

// 出力
2023
3
1
新規
20230215-0001
5
箱No1,No2
1000


ちなみにUWSCRであればsplit()でCSV分割ができるようになっているので以下のように書けます

fid = fopen("data.csv", F_READ)
for i = 1 to fget(fid, F_LINECOUNT)
 row = fget(fid, i)
 // 第5引数TRUEでCSV扱い、この場合第3第4引数は無視される
 csv = split(row, ",",,, TRUE)
 for value in csv
  print value
 next
next
fclose(fid)

// 出力
2023
3
1
新規
20230215-0001
5
箱No1,No2
1000

No.1577 2023/03/19(Sun) 11:46:15

Re: CSV区切りのファイルを正しく区切って呼び出したい / けいち
(解決)
stuncloud様
速く処理したいと1行まとめて読み込んだ結果
より遠回りをしてかえって遅くなっていたようです。
列読み込みをする方が速くなる事もあるんですね
何日も悩んであれこれ思いついた方法があっさりと覆され改善しました。
UWSCRもより拡張され使いやすくなっているのを知りました。
ありがとうございました。

No.1578 2023/03/19(Sun) 13:00:25

以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 20 >> ]

- HOME - お知らせ(3/8) - 記事検索 - 携帯用URL - フィード - ヘルプ - メール - 環境設定 -

- Skin: Modern v2.0 - Author: ロケットBBS -

Rocket Board Type-X (Free) Rocket BBS