【问题标题】:What is the best way to save data in a medium sized database? [closed]在中型数据库中保存数据的最佳方法是什么? [关闭]
【发布时间】:2014-08-04 05:10:07
【问题描述】:

我想以结构化的方式保存一些数据,以便以后使用。现在,我有不同的 bash/perl 脚本来提取大量数据并将其格式化为许多不同的文本文件。我正在自动化所有这些。现在我有一个观察列表(环境,如雨、冰雹……),其中包含一些变量(每行都是一个观察)。我可以用 bash 提取它,但是使用时间和 zome(纬度/经度)我需要检查其他变量,每次观察 800 个。我想知道如何使用这 800 个变量(名称、值)存储数以千计的观察(或更多)以供以后使用。我想知道我是否应该找到 .txt 文件以外的其他内容。

最重要的是,所有 800 个变量实际上都是相同变量(相同名称)在不同时间(00、03、06、...、48)的重复。此外,由于某种原因,几个变量同时具有不同的值(这不是 my 数据)。

现在,我可以阅读我观察的每一行并查看每个变量。现在我需要用 1 个变量堆栈(800)放置 1 个观察值,并为每一行执行此操作。

您对我使用的存储格式有什么想法吗(程序/扩展/等越少越好)来存储它?我看到 .csv 文件或 .txt 文件,但我似乎无法找到一种简单的方法来对所有这些进行分类(以及如何进行分类)。

我写过这样的东西;

while IFS=' ' read -r year month date lat long #And other variables to read line.
do
   ./MyExtractionScript.ksh $lat $long #I need lat/long for position.
done < "$File"

现在我的 MyExtractionScript.ksh 将所有内容保存到 ${fileout},格式如下:TMPDIR 中的每一行都是文件中的一个变量,如下所示;

BS    8500    0    7.5339
RE       0    0    5.9412
UU   12000    3    6.0882
VV   12000    3  -11.0595

变成“3”的“0”是小时(0到48),“VV”是名称。

我应该在 csv 中观察对象,每个小时都包含时间对象吗?如何? :(

很抱歉,我的问题很长而且远非精确、简短或简洁。无论如何,我不是专家。请帮我解决这个问题。

提前致谢。祝你有美好的一天。

PS:对不起我的英语,我是来自蒙特利尔的法裔加拿大人。

【问题讨论】:

  • 您能否更具体地说明“以后使用它”的意思?存储数据的最佳方式很大程度上取决于提取数据时的要求。

标签: database perl bash csv text


【解决方案1】:

对于您的问题,我只是建议使用SQLite

【讨论】:

    【解决方案2】:

    您可以使用CSV 文件。那是一个逗号分隔值文件。稳健且可能最简单的方法是在 Perl 中使用 Text::CSV_XS。这是 CSV 文件的样子,我相信它是不言自明且格式简单的:

    Year,Make,Model,Description,Price
    1997,Ford,E350,"ac, abs, moon",3000.00
    1999,Chevy,"Venture ""Extended Edition""","",4900.00
    1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
    1996,Jeep,Grand Cherokee,"MUST SELL!
    air, moon roof, loaded",4799.00
    

    你想要的是这个:

    # Write array of arrays as csv file
    csv (in => $aoa, out => "file.csv", sep_char=> ";");
    

    然后再打开它:

    my $aoa = csv (in => "data.csv");
    

    然后检索数据以进行编辑或审查:

    my @rows;
    my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 });
    open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";
    while (my $row = $csv->getline ($fh)) {
        $row->[2] =~ m/pattern/ or next; # 3rd field should match
        push @rows, $row;
        }
    close $fh;
    
    $csv->eol ("\r\n");
    open $fh, ">:encoding(utf8)", "new.csv" or die "new.csv: $!";
    $csv->print ($fh, $_) for @rows;
    close $fh or die "new.csv: $!";
    

    它提供的概要应该适合您的需求,除非您想要一个具有ACID 属性的真实数据库。

    【讨论】:

    • 非常感谢,这是一个非常好的答案,详细而准确。我会这样做。再次感谢您。
    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 2017-12-11
    • 2017-03-15
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多