-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CSVパース処理の例を追加して整理 #197
base: master
Are you sure you want to change the base?
CSVパース処理の例を追加して整理 #197
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dateのところだけ必須で、ほかはお任せします。
mkdir("temp"); | ||
scope (exit) rmdirRecurse("temp"); | ||
write("temp/test.csv", "Name,Hoge,Value\nA,Fuga,10.0\nB,Foo,1.5\nC,Bar,-12.5"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これはただのコメントですが、一時ディレクトリを作って最後に消去するやつは、並列テストした時に競合を起こしそうなので、名前かぶりを防ぐため別途共通化した関数とかを作ったほうが良さそう。
↓みたいなやつ
struct DisposableDir
{
string path;
~this()
{
if (path.length && path.exists())
rmdirRecurse(path);
}
alias path this;
}
DisposableDir createDisposableDirectory()
{
DisposableDir dir;
dir.path = buildPath(tempDir(), randomUUID.toString());
mkdir(dir.path);
return dir.move();
}
auto records = readText("temp/test.csv").csvReader(null); | ||
|
||
// バッファを用意して、1行ずつ処理します。 | ||
import std.array : appender; | ||
|
||
auto results = appender!(Record[]); | ||
foreach (record; records) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この部分、せっかくなら公式の例に倣って
import std.array : appender;
auto results = appender!(Record[]);
foreach (record; csvReader(File("temp/test.csv").byLine(KeepTerminator.yes), null))
こうしてみるのはどうでしょうか。
csvReaderはpopFrontのたびに先頭から順に1文字ずつパースしていく仕組みみたいなので、こうすることでファイルの内容を一度に読み込まなくても済みそうです。
数十GBのCSVファイルを読み込む想定だとこのほうが便利かもしれません。
write("temp/test.csv", "Name,Date\nA,20200101\nB,20210101\nC,20220101"); | ||
|
||
// あらかじめDate型に変換する簡単な処理を用意します。異常値は考慮していません。 | ||
Date parseDate(string text8Digit) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dateを事前にimportする必要がありますね。
No description provided.