コンテンツにスキップ

FAQ/ 破堤箇所CSVのインポート

破堤箇所の情報を記したCSVファイルがあります。これをプロジェクトに取り込む方法はありますか。

回答

以下のPowerShellスクリプトを試してください。 このスクリプトをテキストエディタに貼り付け "Import-Bp.ps1" として保存します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# プロジェクトを指定します。
# 破堤点を追加したい河川が、このプロジェクトの中に存在しないとエラーになります。
# この場合は "test_new.fsxproj" が出力されます。
$proj = "test.fsxproj"
# 破堤点csvファイルを指定します。
# エンコーディングはutf8とします。
$csvFile = "bp.csv"

$ErrorActionPreference = "Stop"
[xml]$xml = cat $proj
$csv = Import-Csv -Encoding utf8 $csvFile
foreach ($bp in $csv) {
    $river = $xml.SelectSingleNode("floodSim/conditions/diffusionalRivers/diffusionalRiver [@name='$($bp.'河川')']")
    if ($null -eq $river) {
        throw [System.IO.InvalidDataException]::new(("river {0} not found." -f $bp."河川"))
    }
    $attributes = @{
        name               = $bp."Name"
        distance           = $bp."追加距離(m)"
        length             = "2 0 {0} 3600 {1}" -f (([double] $bp."破堤幅") * 0.5), $bp."破堤幅"
        isConfluenceZone   = $bp."合流点付近" -eq "TRUE" ? "True": "False"
        wlev               = $bp."破堤開始水位(TPm)"
        leveeGlev          = "1 0 {0}" -f $bp."破堤敷高(TPm)"
        direction          = $bp."左右岸" -eq "右岸" ? "True" : "False"
        planeGlev          = ""
        notOneway          = "True"
        reverseBreach      = "False"
        dischargeCoefAlpha = "1"
        dischargeCoefTheta = ""
        valid              = "True"
    }

    $xRiverBreaches = $river.SelectSingleNode("riverBreaches")
    $xRiverBreach = $xRiverBreaches.SelectSingleNode("riverBreach [@name='$($bp.'Name')']")
    if ($null -eq $xRiverBreach) {
        # 新規作成
        Write-Host ("append {0} {1}." -f $bp."河川", $bp.Name)
        $riverBreach = $xml.CreateElement("riverBreach")
        foreach ($key in $attributes.Keys) {
            $riverBreach.SetAttribute($key, $attributes[$key])
        }
        [void] $xRiverBreaches.AppendChild($riverBreach)
    }
    else {
        # データ更新
        Write-Host ("update {0} {1}." -f $bp."河川", $bp.Name)
        foreach ($key in $attributes.Keys) {
            $xRiverBreach.SetAttribute($key, $attributes[$key])
        }
    }
}
$projFile = gi $proj
$newProj = Join-Path $projFile.Directory.FullName ($projFile.BaseName + "_new" + ".fsxproj")
$xml.Save($newProj)

破堤点のデータの例を示します。これをテキストエディタに貼り付け "bp.csv" として保存します。Excelでも編集できるように、エンコーディングは UTF8 with BOM とします。

1
2
3
4
Name,河川,追加距離(m),左右岸,破堤開始水位(TPm),破堤敷高(TPm),破堤幅,合流点付近
BP001,XX川,2600,左岸,6.78,4.78,100,FALSE
BP002,XX川,2600,右岸,6.89,4.89,100,FALSE
BP003,XX川,2800,左岸,6.90,4.90,200,TRUE

PowerShell で実行します。

1
.\Import-Bp.ps1

なお、このスクリプトは PowerShell 7 で動作します。 PowerShell 5 では動作しません。 PowerShell 7 については、FAQ/ PowerShell入門 を参照してください。

関連項目

FAQ/ PowerShell入門


最終更新日: 2023-12-14