2016-06-20 19 views
1

最初に、これがLuaの私の最初のプログラムだと言いたいと思います。 CSVファイルを読み込むLuaアプリケーションを開発する必要があります。このファイルは、4つの列と不明な行数で構成されています。したがって、私はファイルの行の最後まで読む必要があります。各行には、保存された点のxyz座標が格納されます。これらの座標は二重の値として格納されます。今度は、csvファイルから値をテーブル(Luaの配列)にコピーする必要があります。ファイルの後半で、私はigmロボット用のロボットプログラムを編集する必要があります。だから私はテーブルが必要です。今まで私は、休閑コードを持っているが、私は、これは、この起動するrigthの方法であるのかはわからない。だから、最初csvファイルからテーブルにdouble値を読み込みます

local open = io.open 

local function read_file(path) 
    local file = open(path, "r") -- r read mode and b binary mode 
    if not file then return nil end 
    local content = file:read "*a" -- *a or *all reads the whole file 
    file:close() 
    return content 
end 


os.execute("OpenGLM_3.exe -slicesize 3 -model cube_2.stl -ascii - eulerangles 0 0 0") 
local fileContent = read_file("data.csv"); 

return 0; 

を私はcsvファイルを作成し、C++プログラムを、実行したが、後に、私がしたいですプロセスを変更して、C++プログラムがLuaスクリプトから独立しているようにします。ここでこの行はテスト用です。この行の後、私はcsvファイルからテーブルにデータを読み込み、テーブルを画面に表示したいと思います。ですから私にとっては、ファイルの内容をコマンドラインに出力するだけで、スクリプトが正しく動作しているかどうかを確認できます。

私は以前はルアとは仕事をしていませんでしたが、ドキュメントは本当にわかりにくいです。だから私はあなたが私に与えることができるすべての助けに感謝します。

編集:私は今投稿をuser3204845で編集してコードを更新しました。画面にテーブルを印刷するには、printコマンドを使用しました。しかし、そのように私はちょうど0069b568を得た。だから私の考えはfor -loopを使うことでした。しかし、それは動作しません。誰かが私にLuaのテーブルのエントリにアクセスする方法を伝えることができますか? HERESに私のコード:

local open = io.open 

local function read_file(path) 
    local file = open(path, "r") -- r read mode and b binary mode 
    if not file then return nil end 
    local coordinates = {} 

    for line in io.lines(path) do 
    local coordinate_x, coordinate_y, coordinate_z = line:match("%s*(.-),%s*(.-),%s*(.-)") 
    coordinates[#coordinates+1] = { coordinate_x = coordinate_x, coordinate_y = coordinate_y, coordinate_z = coordinate_z } 
    end 

    file:close() 
    return coordinates 
end 


os.execute("OpenGLM_3.exe -slicesize 3 -model cube_2.stl -ascii - eulerangles 0 0 0") 
local coordinates = read_file("data.csv") 
for line in coordinates 
    print(coordinates[line]) 
end 
return 0; 

答えて

2

あなたは自分の価値観をかなり-印刷するString.Formatのを使用することができます。

local coordinates = read_file("data.csv") 
for _, coordinate in ipairs(coordinates) do -- use pairs or ipairs to iterate over tables 
    print(("X: %s, Y: %s, Z: %s"):format(coordinate.coordinate_x, 
             coordinate.coordinate_y 
             coordinate.coordinate_z) 
end 

%sは、文字列値のプレースホルダです:最初の%scoordinates[line].coordinate_xの値に置き換えられます、第2のものは​​などである。

pairs無指定論理に従うない「天然」順序付けを使用しながらipairsを、(1、2、3、...)は、そのインデックスに従ってテーブルを反復処理するために使用される。)

しかし、これらの値を印刷するだけでなく、数値として使用することも考えられます。それに応じてスクリプトを編集してください:

local function read_file(path) 
    local coordinates = {} 

    for line in io.lines(path) do 
     local coordinate_x, coordinate_y, coordinate_z = line:match("%s*(.-),%s*(.-),%s*(.-)") 
     coordinates[#coordinates+1] = { coordinate_x = tonumber(coordinate_x), coordinate_y = tonumber(coordinate_y), coordinate_z = tonumber(coordinate_z) } 
    end 

    return coordinates 
end 

ここで実際には値に対して数学演算を実行できます。これにより、出力をより詳細に制御することもできます。たとえば、上記のフォーマット式の%s%.2fに置き換えると、常に2桁の10進数で数値が表示されます。

+0

ありがとうございました。私はまだ質問があります。私がLuaEditで自分のスクリプトをデバッグしたいとき、 'print'の近くに' do'コマンドがあるとのエラーメッセージが表示されます。だから、私のループは正しいとは思われません。 – user3794592

+0

エラーが見つかりました。私はforループでdoを気にしませんでしたが、まだ動作しません。テーブル上で反復する場合には '行内の行に対して'コードが偽と思われます。 – user3794592

+0

'ipairs'を使用してテーブルを反復処理することができます。また、不要なコードがあったので、 'read_file'メソッドをクリーンアップしました。 –

関連する問題