みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になっております。
FileMaker19 Windows10
WebサイトへCSVをアップロードし、データを取り込む作業があるのですが、
そのフォーマットが1レコードにつき、2行のCSVになっており、困っております。
内訳としましては、1レコード内に、顧客情報と商品情報が保管されており、
一行目は、顧客情報、2行目に商品情報となっております。
現在Excelのマクロを用いてCSVへしておりますが、FileMaker内に顧客、商品のデータがあるので、
FileMakerからエクスポートしたデータがそのフォーマットになればありがたいのですが、こういうことは可能なのでしょうか。
Excelのマクロを下記に載せておきます。
Sub CSV出力()
Dim csvFilePath As String
Dim iCount As Long
Dim jCount As Long
Dim kCount As Long
Dim maxRow As Long
Dim maxCol As Long
Dim fileNo As Integer
Dim FileName As String
Dim wScriptHost As Object, strInitDir As String
'カレントディレクトリをデスクトップに変更
Set wScriptHost = CreateObject("WScript.Shell")
ChDir wScriptHost.SpecialFolders("Desktop")
FileName = Application.GetSaveAsFilename("sample.csv", "CSVファイル(*.csv;),*.csv", 2, "保存するファイルの名前を指定してください。")
' CSVファイルパスの作成
csvFilePath = FileName
' 最終行
maxRow = ActiveSheet.Range("A1").End(xlDown).Row
' 最終列
maxCol = ActiveSheet.Range("A1").End(xlToRight).Column
' ファイル番号
fileNo = FreeFile
' ファイル開く
Open csvFilePath For Output As #fileNo
Dim isSecond As Boolean
isSecond = False
Dim isThird As Boolean
isThird = False
' 縦方向ループ(最終行まで)
For iCount = 2 To maxRow
' 横方向ループ(最終列-1まで)
For jCount = 1 To 80
'基本情報
If jCount < 32 Then
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
'基本情報最後
ElseIf jCount = 32 Then
' ファイル出力(改行付き)
Print #fileNo, Cells(iCount, jCount)
' 商品情報1行目
ElseIf jCount < 48 Then
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
' 商品情報1行目最後
ElseIf jCount = 48 Then
' ファイル出力(改行付き)
Print #fileNo, Cells(iCount, jCount)
' 商品情報2行目最初
ElseIf jCount = 49 Then
If Cells(iCount, jCount) <> "" Then
isSecond = True
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
End If
' 商品情報2行目内容
ElseIf jCount < 64 Then
If isSecond = True Then
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
End If
' 商品情報2行目最後
ElseIf jCount = 64 Then
If isSecond = True Then
' ファイル出力(改行付き)
Print #fileNo, Cells(iCount, jCount)
End If
' 商品情報3行目最初
ElseIf jCount = 65 Then
If Cells(iCount, jCount) <> "" Then
isThird = True
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
End If
' 商品情報3行目内容
ElseIf jCount < 80 Then
If isThird = True Then
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
End If
ElseIf jCount = 80 Then
If isThird = True Then
' ファイル出力(改行付き)
Print #fileNo, Cells(iCount, jCount)
End If
Else
' ファイル出力(改行なし)
Print #fileNo, Cells(iCount, jCount) & ",";
End If
' ループカウンタをコピー
kCount = jCount
Next jCount
'メモ内容がある場合は、メモ行を出力
If Cells(iCount, kCount + 1) <> "" Then
Print #fileNo, "3,,01,";
' 最終列をファイル出力(改行付き)
Print #fileNo, Cells(iCount, kCount + 1) & ","
End If
isSecond = False
isThird = False
Next iCount
' ファイルを閉じる
Close #fileNo
'
End Sub
Offline
考え方の一例です。
任意構造のCSV書式文をグローバルフィールドに生成。
なお、生成には、繰越変数値の「フィールド内容の全置換」が一発処理で簡便です。
その際、FMデフォルトのutf-16以外の文字コードが必要な場合は、
TextEncode関数を使用して、生成テキストから目的の文字エンコードと改行コードを
変換した結果をオブジェクトデータとしてテキストファイル化します。
そのため、Gフィールドはオブジェクト・タイプが必須条件となります。
このGフィールドを〇〇.csv名で「フィールド内容のエキスポート」します。
Last edited by Hiro (2020-11-18 12:34:11)
Offline
なるほど。恐れ入りました。
こんなことができたのですね。
テキストエンコードは盲点でした。
utf-16部分で一度躓きましたが、上記で対応できました。
誠にありがとうございます。
Offline
Pages: 1
[ Generated in 0.016 seconds, 9 queries executed - Memory usage: 514.59 KiB (Peak: 531.12 KiB) ]