从url list获取文本到csv

时间:2017-08-27 08:21:34

标签: csv wget

我需要从网址列表中检索文字 我有带ID和URL的csv(大约150 000行)。在此URL上只是没有HTML代码的纯文本 我需要将这个文本写入带输入csv的ID的csv 这可能与wget有关吗?

输入CSV

  

9788075020536 | http://pemic-books.cz/ASPX/Annotation.aspx?kod=0180853

输出CSV

  

9788075020536 |UčebnicejedílemkorktivuautorůkatedryústavníhoprávaPrávnickéfakultyUniverzity Karlovy v Prazeexterníchspolupracovníků。 V souladustradičnímpojetímústavníhoprávajeobecnástátovědopodávánajakojehovstupníneododělitelnásoučást。 Kniha jereprintempůvodníhovydánízroku 1998,vnakladatelstvíLegesvycházípoprvé。 NaučebnicinavazujeÚstavníprávoastátověda,2.díl,ÚstavníprávoČeskérepubliky,kterýbylvydánínakladatelstvímLegesv roce 2011

1 个答案:

答案 0 :(得分:0)

假设您有以下列

curlcsv文件内容:

0001|columnbefore1|https://www.random.org/integers/?num=1&min=1&max=2&col=1&base=10&format=plain&rnd=new|columnafter1
0002|columnbefore2|https://www.random.org/integers/?num=1&min=3&max=4&col=1&base=10&format=plain&rnd=new|columnafter2
0003|columnbefore3|https://www.random.org/integers/?num=1&min=5&max=6&col=1&base=10&format=plain&rnd=new|columnafter3

以下是您可以使用的“单行”:

  • GAWK:

    gawk ' {
        match($0, /^(([^|]+[|]){2})([^|]+)([|][^|]+)*$/, arr); 
        req = "curl -s \""arr[3]"\"";
        req | getline res;
        print arr[1]""res""arr[4];
    }
    ' curlcsv >result
    

    /^(([^|]+[|]){2}) - 2这里意味着跳过2列(在您的情况下跳过1列)

    ([^|]+) - 获取网址列的内容

    ([|][^|]+)* - 保存其余列值

    结果文件如下所示:

    0001|columnbefore1|2|columnafter1
    0002|columnbefore2|3|columnafter2
    0003|columnbefore3|5|columnafter3
    

    这种方法会对打开的文件造成限制(参见下面的JaromírHeimlich评论)

    解决这个限制问题的方法可能是:

    split -l 100 curlcsv && ls | grep -v curlcsv | xargs -n 1 gawk ' {
        match($0, /^(([^|]+[|]){2})([^|]+)([|][^|]+)*$/, arr); 
        req = "curl -s \""arr[3]"\"";
        req | getline res;
        print arr[1]""res""arr[4];
    }
    ' >>../result
    

    将curlcsv放到空文件夹中,因为split会在该目录中创建大量部分列表。

  • SED:

    cat curlcsv | sed -e 's/^\(\([^|]\+[|]\)\{2\}\)\([^|]\+\)\([|][^|]\+\)*$/echo "\1"$(curl -s "\3")"\4"/' | bash >result
    

    /^(([^|]+[|]){2}) - 2这里意味着跳过2列(在您的情况下跳过1列)

    在这个例子中,sed构造了bash脚本以获得结果。

    由于此解决方案生成bash命令,因此没有gawk解决方案的限制问题。