2013-07-01 4 views
3

URL의 다른 정보가 포함 된 여러 개의 URL이있는 텍스트 파일이 있습니다. txt 파일을 읽고 URL을 배열로 저장하면 어떻게 다운로드 할 수 있습니까? 내가 사용하려는MATLAB의 txt 파일에서 URL 만 읽는 방법

C = textscan(fileId, formatspec); 
나는 형식으로 URL에 대한 formatspec에서 언급해야한다 무엇

?

+0

저는 자바에 익숙하지 않지만 Matlab에서 java를 사용하여 할 수 있다고 생각합니다. [* 문자열의 URL 존재 여부를 감지하는 방법] (http://stackoverflow.com/questions/)을 읽어보십시오. 285619/url-in-a-string) 및 [* Calling Java from MATLAB *] (http://blogs.mathworks.com/community/2009/07/06/)을 참조하십시오. calling-java-from-matlab /). – pm89

답변

4

이것은 textscan의 직업이 아닙니다. 이 경우 regular expressions을 사용해야합니다. MATLAB에서 정규식은 here으로 설명됩니다. URL의 경우 다른 언어로는 here 또는 here을 참조하십시오.

여기 MATLAB의 예입니다 :

% This string is obtained through textscan or something 
str = {... 
    'pre-URL garbage http://www.example.com/index.php?query=test&otherStuf=info more stuff here' 
    'other foolish stuff ftp://localhost/home/ruler_of_the_world/awesomeContent.py 1 2 3 4 misleading://'; 
}; 


% find URLs  
C = regexpi(str, ... 
    ['((http|https|ftp|file)://|www\.|ftp\.)',... 
    '[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]'], 'match'); 

C{:} 

결과 :이 정규식은 프로토콜이 또는는 선도적 인 www. 또는 ftp.이 포함이 당신을 필요로

ans = 
    'http://www.example.com/index.php?query=test&otherStuf=info' 
ans = 
    'ftp://localhost/home/ruler_of_the_world/awesomeContent.py' 

참고. example.com/universal_remote.cgi?redirect=과 같은 값은 이 아니며과 일치합니다.

당신은 계속해서 정규 표현식 커버를 더 많이 만들 수 있습니다. 그러나 결국 가장 중요한 결론에 비틀 거릴 것입니다 (예 : here 예를 들어, 내가 어디에서 내 정규식을 가지고 만든) : 전체 정확한 URL을 정확하게 정의의 정의 주어진 단일 정규식 수 없습니다. 항상에 일치 마다 유효한 URL로 일치합니다. 즉, 표시 할 수있는 임의의 URL에 의해 캡쳐 된 이 아닌 유효한 URL이 있습니다.이 표시됩니다.

그러나이 최종 성명서는 실용적 이라기보다는 이론적 인 것입니다. 일치하지 않는 URL은 유효하지만 자주 발생하지는 않습니다. 즉, URL에 꽤 표준 형식이 있다면 내가 당신에게 준 정규식으로 꽤 많이 덮여있다.

지금, 나는 pm89에 의한 Java 제안으로 약간 주위를 속였습니다. 내가 생각하기에, 코드에 다른 "끈적 거리는 층"을 소개하기 때문에 정규 표현식보다 더 느린 순서입니다 (내 타이밍에서는 차이가 가져 오기를 제외하고 약 40 배 느림).

import java.net.URL; 
import java.net.MalformedURLException; 

str = {... 
    'pre-URL garbage http://www.example.com/index.php?query=test&otherStuf=info more stuff here' 
    'pre--URL garbage example.com/index.php?query=test&otherStuf=info more stuff here' 
    'other foolish stuff ftp://localhost/home/ruler_of_the_world/awesomeContent.py 1 2 3 4 misleading://'; 
}; 


% Attempt to convert each item into an URL. 
for ii = 1:numel(str)  
    cc = textscan(str{ii}, '%s'); 
    for jj = 1:numel(cc{1}) 
     try 
      url = java.net.URL(cc{1}{jj}) 

     catch ME 
      % rethrow any non-url related errors 
      if isempty(regexpi(ME.message, 'MalformedURLException')) 
       throw(ME); 
      end 

     end 
    end 
end 

결과 : 여기 내 버전의

url = 
    'http://www.example.com/index.php?query=test&otherStuf=info' 
url = 
    'ftp://localhost/home/ruler_of_the_world/awesomeContent.py' 

내가 java.net.URL 너무 익숙하지 해요,하지만 분명히, 또한 주요 프로토콜 또는 표준 도메인이없는 URL을 찾을 수 없습니다 (예, example.com/path/to/page) .

이 조각은 의심 할 여지없이 따라 개선 될 수 있지만 더 이상이이 작업을 수행 할 것 왜 당신이 java.net.URL을 사용할 수 의심으로 내가하고, 본질적으로 느린 고려하는 것이 훨씬 더 추악한 솔루션 :

+0

+1 : 좋은 학습과 좋은 해결책. 그러나 단 하나의 방법은 서버에 대한 연결이 필요하고 연결을 확인하기 위해 표준 스키마 (예 : example.com/path/to/page)가없는 빠른 방법이있을 것이라고 생각하지 않습니다. 대답] (http://stackoverflow.com/a/1600333/1698972) 제안. – pm89

3

당신을 촉구 this answer에 따라.그런 공간에 대한 텍스트를 분할

str = fileread('Sample.txt'); 

, strsplit를 사용 : 예를 들어 fileread를 사용하여,

먼저 문자열로 파일을 읽어

matlab에에 동일한 코드를 구현하려면 :

spl_str = strsplit(str); 

마지막으로 UR을 감지 java.net.URL를 사용 LS :

for k = 1:length(spl_str) 
    try 
     url = java.net.URL(spl_str{k}) 
     % Store or save the URL contents here 
    catch e 
     % it's not a URL. 
    end 
end 

당신은 urlwrite을 사용하여 파일에 URL 내용을 쓸 수 있습니다. 하지만 먼저 charjava.net.URL에서 얻은 URL을 변환 :

url = java.net.URL(spl_str{k}); 
urlwrite(char(url), 'test.html'); 

는 도움이되기를 바랍니다.

관련 문제