The Altair Community is migrating to a new platform to provide a better experience for you. In preparation for the migration, the Altair Community is on read-only mode from October 28 - November 6, 2024. Technical support via cases will continue to work as is. For any urgent requests from Students/Faculty members, please submit the form linked here

Retrieve file over SFTP conection

frankiefrankie Member Posts: 26 Contributor II
edited November 2018 in Help
Hello,

how can this be done? I realize that you can execute scripts, but are there any built in tricks in RM that can perform this kind of operation?
Does anybody have code to share where this problem has been tackled one way or another?  ::)

Also, can I somehow provide the name of the file to be retrieved dynamically to the script/operator?


Thank you,
frankie




Answers

  • IngoRMIngoRM Employee-RapidMiner, RapidMiner Certified Analyst, RapidMiner Certified Expert, Community Manager, RMResearcher, Member, University Professor Posts: 1,751 RM Founder
    Hi Frankie,

    hmm, I must admit that I am not really sure if this works without any external tool, sorry. Might be but than I am not aware of that.

    About providing the name dynamically: You could use macros for that. Just define the macro in your process or extract it from your data. You can then use it everywhere via %{your_macro_name}. There are lots of example for this on myExperiment which can be downloaded with our Community Extension for RapidMiner.

    Cheers,
    Ingo
  • JugiJugi RapidMiner Certified Analyst, Member Posts: 12 Contributor II

    Hi,

     

    Any News about SFTP access in the last 5 years?

     

    Regards

    Julian

  • robinrobin Member Posts: 100 Guru

    bump.

  • sgenzersgenzer Administrator, Moderator, Employee-RapidMiner, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,959 Community Manager

    hello @robin - feel free to post in Ideas -> Product Ideas. People can upvote, etc.. there.

     

    Scott

     

     

  • kaymankayman Member Posts: 662 Unicorn

    Not the most straightforward way but I do this using python.

    There are plenty of sftp libraries available, most have decent copy paste examples so you don't need to be a coding geek to get it running.

     

    Below is a basic script using ftplib to upload a file. Unfortunatly it isn't sftp (can't find back immediatly where I used it) but the principle remains the same.

     

     

    <?xml version="1.0" encoding="UTF-8"?><process version="7.6.001">
    <context>
    <input/>
    <output/>
    <macros/>
    </context>
    <operator activated="true" class="process" compatibility="7.6.001" expanded="true" name="Process">
    <parameter key="logverbosity" value="init"/>
    <parameter key="random_seed" value="2001"/>
    <parameter key="send_mail" value="never"/>
    <parameter key="notification_email" value=""/>
    <parameter key="process_duration_for_mail" value="30"/>
    <parameter key="encoding" value="UTF-8"/>
    <process expanded="true">
    <operator activated="true" class="set_macros" compatibility="7.6.001" expanded="true" height="68" name="file variables" width="90" x="112" y="34">
    <list key="macros">
    <parameter key="from" value="%{your_source_path}"/>
    <parameter key="to" value="%{your_destination_path}"/>
    <parameter key="filename" value="%{your_file}"/>
    </list>
    </operator>
    <operator activated="true" class="python_scripting:execute_python" compatibility="7.4.000" expanded="true" height="68" name="upload file" width="90" x="246" y="34">
    <parameter key="script" value="import pandas as pd&#10;from ftplib import FTP&#10;&#10;def rm_main():&#10;&#10; ftp = FTP('ftp_address')&#10; #ftp.login(user='username', passwd = 'password')&#10; ftp.login()&#10; target = &quot;%{from}/%{filename}&quot;&#10; ftp.cwd(&quot;%{to}&quot;)&#10; &#10; try:&#10; f = open(target, &quot;rb&quot;)&#10; ftp.storbinary('STOR '+'%{filename}', f)&#10; f.close()&#10; ftp.quit() &#10; print(&quot;success&quot;)&#10;&#10; except:&#10; print(&quot;failed&quot;)&#10; return "/>
    </operator>
    <portSpacing port="source_input 1" spacing="0"/>
    <portSpacing port="sink_result 1" spacing="0"/>
    </process>
    </operator>
    </process>

    and for download

     

     

    <?xml version="1.0" encoding="UTF-8"?><process version="7.6.001">
    <context>
    <input/>
    <output/>
    <macros/>
    </context>
    <operator activated="true" class="process" compatibility="7.6.001" expanded="true" name="Process">
    <parameter key="logverbosity" value="init"/>
    <parameter key="random_seed" value="2001"/>
    <parameter key="send_mail" value="never"/>
    <parameter key="notification_email" value=""/>
    <parameter key="process_duration_for_mail" value="30"/>
    <parameter key="encoding" value="UTF-8"/>
    <process expanded="true">
    <operator activated="true" class="set_macros" compatibility="7.6.001" expanded="true" height="68" name="file variables" width="90" x="112" y="34">
    <list key="macros">
    <parameter key="from" value="your_sourcepath"/>
    <parameter key="to" value="your_destination_path"/>
    <parameter key="filename" value="sample.txt"/>
    </list>
    </operator>
    <operator activated="true" class="python_scripting:execute_python" compatibility="7.4.000" expanded="true" height="68" name="download file" width="90" x="246" y="34">
    <parameter key="script" value="import pandas as pd&#10;import os&#10;&#10;from ftplib import FTP&#10;&#10;def rm_main():&#10;&#10; ftp = FTP('your_ftp_address')&#10; #ftp.login(user='username', passwd = 'password')&#10; ftp.login()&#10;&#9;&#10; ftp.cwd(&quot;%{from}&quot;)&#10; filename = &quot;%{filename}&quot;&#10; &#10; target = os.path.join(&quot;%{to}&quot;,filename)&#10; &#10; try:&#10; f = open(target, 'wb')&#10; ftp.retrbinary('RETR ' + filename, f.write)&#10; f.close&#10; ftp.quit() &#10; &#10; print(&quot;success&quot;)&#10; &#10; except:&#10; &#10; print(&quot;failed&quot;)&#10; &#10; return "/>
    </operator>
    <portSpacing port="source_input 1" spacing="0"/>
    <portSpacing port="sink_result 1" spacing="0"/>
    </process>
    </operator>
    </process>

    Look for sftp examples and change the code accordingly, ask your local python guru for support if needed but it's less scary as it looks at first glance

     

Sign In or Register to comment.