クイックメニュー
スレタイ検索

UNIXプログラミング質問すれ Part10

1unco ◆manko/yek. [sage]
AAS
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド 

前スレ 
Part9 hibari.2ch.net;

2011/04/18(月)17:06:36.77.net


935デフォルトの名無しさん [sage]

AAS

NG

この頃は Linux ばっかり使っている
UNIX がインストールされているマシンが身近にない

2022/02/01(火)13:51:20.76(/+irRzAS.net)


936デフォルトの名無しさん

AAS

NG

たとえば古い passwd ファイルの形式とかで使われていた
root:x:0:0:root:/root:/bin/bash
user01:x:500:500::/home/user01:/bin/bash
のような「:」区切りのテキストファイルのデータベースを扱いたいとき
C標準のライブラリは何ですか?
Rust用のcrateで言うと何ですか?

2023/08/24(木)18:51:08.86(CY1BVKcv.net)


937デフォルトの名無しさん [sage]

AAS

NG

Ruby なら、CSV モジュールを使う

require 'csv'

options = { col_sep: ":" } # 列区切り文字

CSV.foreach( "input.csv", options ) do |row| # 1行ずつ処理する
p row
end

出力
["root", "x", "0", "0", "root", "/root", "/bin/bash"]
["user01", "x", "500", "500", nil, "/home/user01", "/bin/bash"]

2023/08/24(木)20:05:39.07(AvQ+uDT8.net)


938デフォルトの名無しさん [sage]

AAS

NG

>>830
Rust
区切るだけならstr.split(':')かstr.splitn(7, ':')が各項目のstrを次々と返してくれる
各項目毎に型(文字列や整数やOptionなど)フィールドを持つ構造体に入れるなら一般的にserde crateが万能
そのケースならcsv crateで':'をデリミタ指定すると容易

2023/08/25(金)06:42:11.04(1ayFYibv.net)


939デフォルトの名無しさん

AAS

NG

2023/08/25(金)09:30:30.62(5+gJach+.net)


940デフォルトの名無しさん [sage]

AAS

NG

ちょと治した
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=c7b6a2e68759ea120ea83d56bdc72021
file の reader で読むと
# Hello, and thanks for looking into the Rust Playground's security!
っていう行が勝手に先頭に足される
csv の reader で読むと余計な行が増えない
穴があるんかな

2023/08/25(金)10:27:32.18(5+gJach+.net)


941デフォルトの名無しさん

AAS

NG

ああ has_headers() が読み飛ばしてただけか

2023/08/25(金)10:29:22.44(5+gJach+.net)


942937 [sage]

AAS

NG

>>937
を修正。
2, 3列目を整数に変換する

require 'csv'

proc = Proc.new do |field, field_info|
case field_info.index
when 2, 3 then field.to_i
else
field # 処理なし
end
end

options = { col_sep: ":", :converters => proc } # 列区切り文字

CSV.foreach( "input.csv", options ) do |row| # 1行ずつ処理する
p row
end


出力
["root", "x", 0, 0, "root", "/root", "/bin/bash"]
["user01", "x", 500, 500, nil, "/home/user01", "/bin/bash"]

2023/08/26(土)03:49:56.11(wsJDYSi/.net)


943デフォルトの名無しさん [sage]

AAS

NG

C言語とRustについて聞かれているのに
一生懸命Rubyで答えてどうするの?
ちょっと心配した方が良いレベルやぞ

2023/08/26(土)21:18:17.35(C41SkMxi.net)


944デフォルトの名無しさん [sage]

AAS

NG

Rustでは文字列から他の型(数値など)への変換やその逆を自動でやってくれる(serdeがある)
以下のように(好きな型名とフィールド名で)構造体を定義するだけで動く

#[derive(Debug, serde::Deserialize)]
struct Passwd {
 name: String,
 passwd: String,
 uid: u32,
 gid: u32,
 gecos: String,
 dir: String,
 shell: String,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
 // CSVリーダーをヘッダ無しで区切り文字コロンでPASSWD_PATHファイルから読み込みで作成
 let mut reader = csv::ReaderBuilder::new()
  .has_headers(false)
  .delimiter(b':')
  .from_reader(std::fs::File::open(PASSWD_PATH)?);
 // 各行を構造体Passwdへ読み込む (様々なエラーを捕捉できるようResult型が返る)
 for result in reader.deserialize::<Passwd>() {
  let passwd = result?;
  println!("{passwd:?}");
 }
 Ok(())
}

2023/08/27(日)03:03:02.52(/wQZGqy6.net)

名前

メール

本文