Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    callmekohei
    @callmekohei
    どのパソコンでも動作するのですが、
    昨日、遠隔でリモートPCにビルドした分を置いて実行するとエラーが出ます。
    コードもしくはビルドコマンドでなにか設定等があるのでしょうか?
    お知恵を拝借できればありがたいです。。。
    該当のコードは下記になります
    open System.IO
    open System.Text
    open FSharp.Data
    open Callmekohei.MyCsv.CsvUtil
    
    [<LiteralAttribute>]
    let path = __SOURCE_DIRECTORY__ + "./../csv/"
    
    type AAA = CsvProvider<Sample="foo.csv",Schema="請求先番号=string",ResolutionFolder=path>
    let aaa () =
      query{
        for v in AAA.GetSample().Rows do
          select (v.請求先番号)
      }
      |> DumpQuery
    
    [<EntryPoint>]
    let main argv =
      aaa ()
      printfn "こんにちは!"
      0
    ビルドコマンドは下記になります
    dotnet publish -c Release -r win10-x86 --self-contained true -p:PublishDir=.\publish
    エラー内容は下記になります
    callmekohei
    @callmekohei
    C:\Users\callmekohei\Documents\一時避難\★実験app>実験だよー.bat
    Unhandled exception. System.IO.DirectoryNotFoundException:
    Could not find a part of the path 'C:\Users\callmekohei\Desktop\templatefsharp2\csv\smart.csv'.
    at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle)
    
    // C:\Users\callmekohei\Desktop\templatefsharp2
    // ⇒ ビルドしたパソコンのパス
    ちなみにビルドしたパソコンでは、どの場所においても正常に動作します
    omanuke
    @omanuke_twitter
    リモートデスクトップだとパスやら何やら元の環境が影響するとか何かあるのでは?
    よく知らんですが。
    いや昨日リモートデスクトップして動画再生したらこっちのPCで再生されてなるほどー色々モニョモニョいい感じにするのかーと思った次第
    vain0x
    @vain0x
    CsvProviderの詳細を確認していないので間違っているかもしれませんが、 __SOURCE_DIRECTORY__ はコンパイル時に文字列リテラル ("C:/Users/...") に展開されるので、path (ResolutionFolder) が絶対パスになっていると思います
    callmekohei
    @callmekohei
    おはようございます!
    path (ResolutionFolder) が絶対パスになっていると思います
    おっしゃる通りでした!
    内部的に相対パスに変換されてると勘違いしてました・・・
    確認コード
    open FSharp.Data
    
    [<LiteralAttribute>]
    let CsvFolder = __SOURCE_DIRECTORY__ + "./../csv/"
    type Csv = CsvProvider<Sample="fruits.csv",Schema="フルーツの名前=string",ResolutionFolder=CsvFolder>
    
    [<EntryPoint>]
    let main argv =
    
      printfn "%A" CsvFolder
      // 表示結果:"C:\Users\callmekohei\Desktop\相対パスの不具合調査\templatefsharp2\templatefsharp./../csv/"
    
      query{
        for v in Csv.GetSample().Rows do
          select (v)
      }
      |> printfn "%A"
      // 表示結果: seq ["リンゴ"; "バナナ"; "チェリー"]
    
      0
    C:\Users\callmekohei\Desktop\相対パスの不具合調査\templatefsharp2\templatefsharp./../csv_/
    とフォルダ名を"csv"から"csv_"と変更して、別の場所で同じフォルダ構成で"csv"フォルダを読むか試したらエラーになりました

    結論

    CsvProviderを別の場所や別のパソコンで使う場合はSampleは使用してはダメですね。。。
    ありがとうございました!
    callmekohei
    @callmekohei
    何度もすいません。。。追記です。。
    GetSample()を使うと、絶対パスになって、CsvProviderのSampleのパスが相対パスにならななくなりますね・・・
    これがエラーの原因でした。。。
    現場からは以上です
    Kentaro Inomata
    @matarillo
    F#公案(テストプログラムが通過するようにコード修正しながらプログラミング言語を学ぶ)をざっと日本語にしてみました。
    https://github.com/matarillo/FSharpKoans.ja-jp
    callmekohei
    @callmekohei

    ご存じの方いらっしゃいましたら、ご教授いただきたいのですが
    下記のコード(簡略化してます)にて実行すると
    _fileDataCreated に何も入力されないです
    期待する文字列として、abc を期待するのですが、
    どのようにしたら abc が入力されるのでしょうか?
    namespace MyMapping
    
    module public MyCsvInputFile =
    
      let mutable public _fileDateCreated = "abc"
    
      [<CLIMutable>]
      type public Foo = {
    
        ファイル作成日時 : string
        作成日時 : string
        更新日時 : string
    
      }
    
      [<Sealed>]
      type private Bar () as this =
    
        inherit ClassMap<Foo>()
    
        do
    
          // TODO needs to read _fileDateCreated
          this.Map(fun x -> x.ファイル作成日時).Constant(_fileDateCreated) |> ignore
          this.Map(fun x -> x.作成日時).Index(0) |> ignore
          this.Map(fun x -> x.更新日時).Index(1) |> ignore
    
    
      let private csvConfig : CsvConfiguration  =
        CsvConfiguration(CultureInfo.CurrentCulture)
        |> fun x ->
          x.RegisterClassMap<Bar>() |> ignore
          x
    
    
      let public csvRead (stream:Stream) =
    
        use reader = new StreamReader(stream,Encoding.GetEncoding (codepage))
        use csv = new CsvReader(reader,csvConfig)
    
    
        while (csv.Read()) do
          cqGood.Enqueue(csv.GetRecord<Foo>())
    仕様前提としてCsvHelperというライブラリを使用してます
    callmekohei
    @callmekohei
    上記の件、解決しました!
    結論としては、後程変更したい項目はmutableにすると変更できるということでした
    下記に概要のコードを書いておきます
    [<CLIMutable>]
    type public Foo = {
    
      mutable ファイル作成日時 : string    // ここがポイントでした!
      作成日時 : string
      更新日時 : string
    
    }
    
    let foo = new Foo()
    
    foo.ファイル作成日時 <- "abc"