查询CSV文件


30

有谁知道一个简单的工具可以打开CSV文件,并允许您对其进行基本的SQLesque查询?就像各种图形工具一样,它易于使用。

我知道我可以编写一个小脚本来将CSV导入到SQLite数据库中,但是由于我想有人在我之前想到了这一点,所以我只想询问是否存在。提示此问题的原因是我对Excel的有限筛选功能感到沮丧。

也许其他一些数据可视化操作工具将提供类似的功能。

首选Free或OSS,但我愿意接受任何建议。

编辑:

我确实希望有一些关于如何执行以下操作的清晰教程,而不仅仅是“使工作表成为ODBC条目”或“使用ODBC文件编写程序”,或者更多关于要使用的应用程序的想法。注意:我无法使用MS Access。

另一个编辑:

我仍然愿意使用SQLite解决方案。我的平台是半古老的Win2k笔记本电脑,上面装有P4。它的速度很慢,因此资源匮乏的解决方案是理想的选择,并且很可能会取得成功。


只是要确保:您仍然愿意使用SQLite解决方案?(就像使用.separator和.import命令一样?)您正在使用什么平台?
Arjan

出于好奇:您为什么不能使用MS Access?
路德维希·威尼泽尔

@ Arjan-我仍然愿意使用SQLite解决方案。我的平台是一个半古老的Win2k lappy,上面有一个P4。它的速度很慢,因此资源匮乏的解决方案是理想的,并且很可能会取得成功。
J. Polfer

2
@ fretje-您必须没有使用SQLite的经验。源代码总计1MB。它用在手机上。Win32可执行文件(引擎和全部)为300KB。
J. Polfer

1
@sheepsimulator:我知道这很轻巧,但我的观点仍然是...对文本文件的ODBC访问基本上已包含在OS中,而使用SQLite时,您仍然必须先安装一些文件并将csv文件导入数据库。不安装任何东西仍然不等于安装很小的东西,不是吗?
fretje

Answers:


13

您是否尝试过LogParser

日志解析器是一种功能强大的多功能工具,可提供对基于文本的数据(例如日志文件,XML文件和CSV文件)以及Windows®操作系统上的关键数据源(例如事件日志,注册表,文件系统和ActiveDirectory®。您可以告诉Log Parser所需的信息以及处理方式。您可以将查询结果自定义格式设置为基于文本的输出,也可以将其保留到SQL,SYSLOG或图表等更特殊的目标中。

大多数软件旨在完成有限的特定任务。Log Parser是不同的...它的使用方式数量仅受用户需求和想象力的限制。世界是您使用Log Parser的数据库。

一个教程(和另一个在使用SQL像CSV的查询语言)文件,我发现使用谷歌

查询示例:

logparser -i:CSV "SELECT TOP 10 Time, Count INTO c:\logparser\test\Chart.GIF 
FROM c:\logparser\test\log.csv ORDER by Time DESC" -charttype:bar3d

论坛的支持和许多你的问题将得到解答forums.iis.net/default.aspx?GroupID=51这是官方LOGPARSER论坛
svandragt

2
有关更多示例,请访问codinghorror.com/blog/archives/000369.html尼斯;太糟糕了,仅Windows。
Arjan

34

我认为OpenOffice.org数据库可以满足您的需求。它是这样的。

  1. 启动Open Office.org数据库,它显示“ 数据库向导

  2. 选择“ 连接到现有数据库:文本

    在此处输入图片说明

  3. 指定文本文件的路径以及分隔符等详细信息。

    在此处输入图片说明

  4. 创建和执行查询

    在此处输入图片说明

如果您曾经使用过Microsoft Access,您会发现GUI熟悉。


如果没有GUI就可以做,那么总会有传统的UNIX命令。我经常使用它们来对(小的)CSV文件进行简单的查询。下面是它的工作原理:

clause      operation   command
-------------------------------
from             join     `join`
where     restriction     `grep`
order by           --     `sort`
group by  restriction      `awk`
having    restriction     `grep`
select     projection      `cut`
distinct  restriction     `uniq`
limit     restriction     `head`
offset    restriction     `tail`

哇,好答案!+1
他们

这看起来像把戏。我会看看我是否可以基于这个老化的兔子。
J. Polfer

+1。凉!并没有去探索OO。一直以为MS O具有优势!
斯旺南德

生病!大文件的性能如何。我从事生物信息学研究,并且有巨大的制表符分隔的垃圾内容
user2751

@ 1alstew1:对于大文件,我会尽量避免使用这两种方法,而是使用真实的数据库。另外,请确保使用批处理导入(LOAD)将数据获取到数据库中,这比INSERT快得多。
路德维希·韦恩泽尔

13

您可以使用ODBC查询文本文件:

使用ODBC数据提供程序访问文本文件

请注意,您不需要MS Access即可工作,上面链接中的教程仅使用MS Access创建文本文件,但是由于您已经有了文本文件,请向下滚动一半,然后在看到的位置开始教程。标题访问文本文件

更新:我自己在.csv文件上创建了DSN,以便能够创建此分步教程...来了:

  • 确保您的.csv文件位于其自己的目录中,没有其他任何内容。
  • 打开“ ODBC数据源管理器”(开始-控制面板-管理工具-数据源(ODBC))。
  • 转到“文件DSN”选项卡,然后单击“添加...”。
  • 从列表中选择“ Microsoft文本驱动程序(* .txt,* .csv),然后单击”下一步>”。
  • 为您的文件数据源命名(例如“ test”),然后单击“ Next>”。
  • 单击“完成”(此后,将出现一个对话框,其中“数据源名称”和“描述”字段确实显示为灰色。这是正常现象。不用担心。
  • 取消选中“使用当前目录”复选框。“选择目录”按钮将被启用。
  • 单击“选择目录”按钮,然后导航到第一步中放置.csv文件的文件夹。
  • 点击“选项>>”按钮。
  • 单击“定义格式...”按钮。
  • 在左侧的“表格”列表中,选择您的.csv文件,然后单击“猜测”按钮。(这将分析您的csv文件,并为.csv文件中的每一列创建一个适当的字段。)
  • 在右边的列表中浏览生成的列(F1,F2,...),为其指定有意义的名称并设置适当的数据类型(有时猜测并不总是正确的)。
  • 一切设置正确后,单击“确定”(2次)。

此时,您应该有一个文件DSN,您可以使用它通过ODBC访问.csv文件。如果检查放置.csv文件的文件夹,则会看到schema.ini文件,其中包含刚创建的配置。当您有多个.csv文件时,每个文件都对应一个表,并且每个表在schema.ini文件中都有一个[ filename .csv]块,在其中定义了不同的列...您也可以创建/更改该模式直接在文本编辑器中创建.ini文件,而不是使用上述GUI。

至于您的额外问题“如何使用查询工具连接到此ODBC提供程序”:
我有一个很久以前写给自己的工具,不符合发布条件。但是Google进行了快速搜索,并提供了odbc-view,这是一种免费软件,可以满足您的需求。
我下载并安装了该工具。
启动工具后:

  • 单击“数据源...”。
  • 选择您先前创建的文件数据源(例如“测试”)。
  • 在查询窗格中,键入“从[ filename .csv]中选择* ”。
  • 点击“执行”。

您现在应该在下部窗格中看到.csv文件的内容。
希望能对您有所帮助...让我知道您的工作方式或是否需要进一步的帮助。


@ fretje-我知道我不需要MS Access才能工作,我自己尝试过。我遇到了两个问题:1.我想拥有一个GUI或CLI实用程序,完成后可以用来查询CSV-DB。上面引用的教程中没有列出任何内容,它假定您想通过编写.NET应用程序来访问此ODBC数据库。2.在PC上,我将使用此解决方案,但我认为ODBC设置不足以遵循此解决方案。在ODBC数据提供程序创建时,我无法命名我的DSN,此框显示为灰色。可能是系统设置问题。
J. Polfer 09年

@ fretje-如果您可以解释如何使用查询工具连接到该ODBC提供程序,那就太好了;我不知道该怎么做。是在寻找一个全面的答案。
J. Polfer 09年

8

我喜欢使用R快速访问csv文件。虽然语言不是直接使用SQL,但是您可以使用R中的简单命令来完成所有这些事情。R还为您提供了制作精美图形和其他功能的能力。


5

您始终可以将文件读入Excel,并通过ODBC将Excel用作数据源,并对它运行查询。


我可以?这听起来像黑魔法。您可以找到教程的链接吗?
J. Polfer 09年

2
@sheepsimulator:Excel只是打开csv文件...一旦有了Excel文件,就可以使用ODBC查询它,就像查询文本文件一样(请参见下面的答案)。
fretje

5

我发现实现此目的的最简单方法是仅使用SQLite的内置CSV导入功能:

  1. sqlite3 mydatabase.sqlite
  2. sqlite> .mode csv
  3. sqlite> .import mydata.csv <tablename>

现在,您有了一个可以正常查询的数据库。我还发现上面的性能很好,我只是在10-15秒内导入了300万行。


3

我找到了一个小型的非图形应用程序来执行此操作:csvsql

文档在这里


这是EXACTLY应用程序我要寻找的类型,虽然这将是很好,如果它有一个GUI。可悲的是,我现在真的没有一个好方法来为Win2k盒编译它。会尽快回复您。另外,作者没有使用automake或类似的工具,因此要进行编译将需要一些麻烦。
J. Polfer

很难找到,这是我唯一能找到的与您描述的相近的东西。也许有人想编写一个应用程序,该应用程序可以导入文本文件并使用例如SQL Lite对其执行SQL查询?
Stefan Thyberg,2009年

1
sqlite3(读取SQLite数据库的命令行应用程序)还内置了支持导入文件-看到它.separator和.IMPORT命令在sqlite.org/sqlite.html
阿尔扬·

1
是的,我看到它在答案中多次提到,但我想的更多是带有查询窗口的功能完备的类似记事本的应用程序。
Stefan Thyberg,2009年

3

您可以看一下免费工具q-文本作为数据库,它允许直接在csv文件上执行SQL,包括连接,分组和任何其他SQL构造。还包括自动检测列名和列类型。

这是一个命令行工具,与Linux的操作方式相匹配(例如,从stdin进行配管(如果需要),用于自定义行为的特殊标志等)。

在后台使用sqlite,因此重量很轻且易于使用。

全面披露-这是我自己的开源工具。希望你觉得它有用

哈雷尔·本·阿蒂亚


这个工具绝对棒!
戴维·费伦茨·罗戈扬

2

我认为,Resolver One是我发现将来可能更容易实现的工具。

这是一个电子表格,可生成易于修改的Python代码。对于那些是开发人员,偶尔需要“下台”解决电子表格中的问题的人来说,这似乎是一种以他们熟悉的语言解决电子表格式问题的直观方法。

这为我提供了使用Python的借口。Python让我开心。


2

H2 JDBC驱动程序提供了一个非常有用的csvread函数,使您可以执行以下操作:

select * from csvread(test1.csv) test1 
inner join csvread(test2.csv2) test2
on test1.id = test2.foreignkey

有多种使用此驱动程序的方法,而不必深入编写代码来使用它。

就个人而言,我更喜欢Squirrel SQL Client,它为您提供了一个不错的用于运行查询的GUI。要使用它,您需要做的就是将已经列出的H2 In-MemoryDriver类路径指向您下载的H2驱动程序。使用驱动程序设置合适的别名后,即可运行所需的任何随机SQL。结果显示在一个漂亮的表格中,并显示各种其他功能,用于导入,导出等。

或者,您可以使用Groovy编写一个快速脚本以根据需要加载和使用驱动程序。请参阅此示例博客文章,以了解如何。

似乎有人扩展了上述常规脚本并将其变成一个不错的命令行工具来运行查询,请参见gcsvsql。这样,您可以运行如下命令:

gcsvsql "select * from people.csv where age > 40"

2

您可能想尝试Q工具。它非常轻巧,仅需要Python 2.5或更高版本。




0

虽然不是免费的,但我为此找到的最佳程序是File Query。与其他基于命令行的解决方案或需要在访问文件之前导入/设置文件的其他解决方案不同,“文件查询”可让您打开文件(甚至像普通文本编辑器一样打开GB,并会自动为您解析布局,并让您通过简单的对话进行几乎所有的查询。

它有点贵,但是如果您只需要做一次,就可以始终免费使用30天试用版。他们还提供了不错的指南,甚至提供了视频,帮助您入门。


0

您可以使用WHS。例如,我在目录'C:\ Users \ user837 \ Desktop \ t4'中有4个文件:1.txt

id;sex_ref;sale
1;1;10
2;2;30
3;1;20

2.txt

sex_id;name
1;male
2;female

schema.ini

[1.txt]
Format=Delimited(;)
ColNameHeader=True
MaxScanRows=50
DecimalSymbol=,
[2.txt]
Format=Delimited(;)
ColNameHeader=True
MaxScanRows=50
DecimalSymbol=,

和Hello.js

WScript.Echo("Hello World!");
var cn = new ActiveXObject("ADODB.Connection");
cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Users\\user837\\Desktop\\t4\";Extended Properties=\"text;HDR=NO;FMT=Delimited\"");

var rs = cn.Execute("select * from 1.txt as t1 left join 2.txt as t2 on t1.sex_ref = t2.sex_id");

while (!rs.EOF) 
{
    WScript.Echo(           rs.Fields("id").Value
                  + "###" + rs.Fields("sex_ref").Value
                  + "###" + rs.Fields("name").Value
                );
    rs.moveNext();
}

现在只需双击Hello.js,您将逐行看到sql reqult。请参阅WHS文档以查看所有查询结果。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.