如何在Linux命令行上解析CSV文件?
做以下事情:
csvparse -c 2,5,6 filename
Run Code Online (Sandbox Code Playgroud)
从所有行中提取第2,5和6列的字段.
它应该能够处理csv文件格式:http://tools.ietf.org/html/rfc4180这意味着引用字段并根据需要转义内部引号,因此对于包含3个字段的示例行:
field1,"field, number ""2"", has inner quotes and a comma",field3
Run Code Online (Sandbox Code Playgroud)
所以,如果我请求上面一行的字段2,我得到:
field, number "2", has inner quotes and a comma
Run Code Online (Sandbox Code Playgroud)
我很欣赏有很多解决方案,Perl,Awk(等)来解决这个问题,但我想要一个本机bash命令行工具,它不需要我调用其他脚本环境或编写任何其他代码(!).
我最近使用了Java Web Start应用程序.我使用我正在查看的页面中的嵌入式jnlp链接从我的Web浏览器启动它.该应用程序已下载,启动并正常工作.它可以访问我的本地文件系统,并在重新启动它之间记住我的偏好.
我想知道的是,为什么Java Web Start应用程序不是Web上复杂应用程序的更流行的交付格式?为什么开发人员经常花费大量时间和精力在html/javascript中复制桌面功能,而使用Java和Java Web Start可以更轻松地提供桌面应用程序的强大功能?
我知道在某些企业环境中,例如银行业,它们是向客户提供复杂交易应用程序的相对流行的方式,但为什么它们不能在整个网络上普及?
(为了便于讨论,让我们假设一个世界:下载源是"可信的"和应用程序是"签名"(即没有安全问题),下载速度快(加载时间快)开发人员知道Java(数量上他们知道html/js/php)).
我想要一个有效的算法(或库),我可以在Java中使用它来搜索字符串中的子串.
我想做的是:
给定一个输入字符串 - INSTR:
"BCDEFGH"
还有一组候选字符串--CAND:
"AB","CDE","FG","H","IJ"
在INSTR中查找匹配为子字符串的任何CAND字符串
在这个例子中,我将匹配"CDE","FG"和"H"(但不是"AB"和"IJ")
可能有数千个候选字符串(在CAND中),但更重要的是,我将进行数百万次搜索,因此我需要它快速.
我想使用char数组.此外,我并不喜欢建筑解决方案,例如分发搜索 - 只是在本地进行搜索的最有效的功能/算法.
另外,CAND和INSTR中的所有字符串都将相对较小(<50个字符) - 即目标字符串INSTR相对于候选字符串不长.
我应该提到的更新,在所有INSTR值中,CAND字符串集是不变的.
更新我只需要知道有匹配 - 我不需要知道匹配是什么.
最终更新 由于实施简单,我选择尝试AhoCorsick和Rabin-Karp.因为我有可变长度模式,所以我使用了一个修改过的Rabin-Karp,它会散列每个模式的前n个字符,其中n是最小模式的长度,N则是我的滚动子字符串搜索窗口的长度.对于Aho Corsick,我用过这个
在我的测试中,我在两篇文档新闻论文中搜索了1000个模式,平均1000次迭代等...标准化时间完成:
AhoCorsick:1
拉宾卡尔普:1.8
天真搜索(检查每个模式并使用string.contains):50
*描述以下答案中提到的算法的一些资源:
http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module5/module5.html
http://www.cs.princeton.edu/courses/archive/spr09/cos226/lectures/18SubstringSearch-2x2.pdf
我需要一个磁盘支持的Map结构才能在Java应用程序中使用.它必须具有以下标准:
记录键将是字符串或长整数.如上所述,读取将比写入更频繁,并且大多数读取将仅仅是检查密钥是否存在(即,不需要读取密钥相关数据).每条记录仅更新一次,记录不会被删除.
我目前使用Bdb JE但我正在寻找其他选择.
更新
从那以后,通过减少对二级密钥的依赖性,提高了现有BDB设置的查询性能.有些查询需要在两个辅助密钥上进行连接,并将它们组合成一个复合密钥,我在查找中删除了一个间接级别,这样可以很好地加快速度.
这是我在阅读了几个关于jpa批量插入的主题后创建的简单示例,我有2个持久对象User和Site.一个用户可以有很多站点,所以我们在这里有一对多的关系.假设我想创建用户并创建/链接几个站点到用户帐户.考虑到我愿意为Site对象使用批量插入,这是代码的样子.
User user = new User("John Doe");
user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码(我使用hibernate作为jpa实现提供程序)时,我看到以下sql输出:
Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Run Code Online (Sandbox Code Playgroud)
所以,我的意思是"真正的"批量插入不起作用或我感到困惑?
以下是此示例项目的源代码,这是maven项目,因此您只需下载并运行mvn install来检查输出.
更新:
在Ken Liu亲切地建议之后,我已禁用Site对象id自动生成:
User user = new User("John Doe");
user.getSites().add(new Site(1, "google.com", user));
user.getSites().add(new …
Run Code Online (Sandbox Code Playgroud) 有没有人知道我可以用来生成规范路径的任何Java库(基本上删除反向引用).
我需要做以下事情:
原始路径 - >规范路径
/../foo/ -> /foo
/foo/ -> /foo
/../../../ -> /
/./foo/./ -> /foo
//foo//bar -> /foo/bar
//foo/../bar -> /bar
Run Code Online (Sandbox Code Playgroud)
等等...
目前我懒洋洋地依赖于使用:
new File("/", path).getCanonicalPath();
Run Code Online (Sandbox Code Playgroud)
但是这解决了针对实际文件系统的路径,并且是同步的.
java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.ExpiringCache.get(ExpiringCache.java:55)
- waiting to lock <0x93a0d180> (a java.io.ExpiringCache)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:137)
at java.io.File.getCanonicalPath(File.java:559)
Run Code Online (Sandbox Code Playgroud)
在我的文件系统中不存在我规范化的路径,因此只需该方法的逻辑就可以了,因此不需要任何同步.我希望有一个经过良好测试的库,而不是自己编写.
我需要能够识别日期字符串.如果我无法区分月份和日期(例如12/12/10)并不重要,我只需要将字符串分类为日期,而不是将其转换为Date对象.所以,这实际上是一个分类而不是解析问题.
我会有一些文字,例如:
"bla bla bla bla 12 Jan 09 bla bla bla 01/04/10 bla bla bla"
我需要能够识别每个日期字符串的开始和结束边界.
我想知道是否有人知道任何可以做到这一点的java库.到目前为止,我的google-fu还没有提出任何建议.
更新:我需要能够识别出最广泛的表示日期的方法.当然,天真的解决方案可能是为每种可想到的格式编写一个if语句,但是模式识别方法,使用训练有素的模型,理想情况下是我所追求的.
请看以下示例:
public void init() {
final Environment env = new Environment();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
Run Code Online (Sandbox Code Playgroud)
首先,env
存储在哪里?是吗:
我的猜测是第一个选择.
其次,执行这样做会产生任何性能问题(而不是简单地创建env
类的成员变量并引用它),特别是如果要创建大量引用最终局部变量的内部类构造.
当我们的某个用户在IE 8.0.6001.18702中加载首页时,我们的网站崩溃了.
页面短暂加载,然后IE停止加载它并显示错误消息.
地址栏中的URL更改为:
res://ieframe.dll/acr_error.htm#ourwebsite.com,http://demo.ourwebsite.com/login/
Run Code Online (Sandbox Code Playgroud)
在加载facebook.com和barnesandnoble.com这样的网站时,我已经读过IE8的其他用户发生的这种情况.
论坛,如这是指可能的修复,如:
unchecking the'Enable third party browser extensions' option in IE 8 advanced option
Run Code Online (Sandbox Code Playgroud)
然而,这对我们来说并不是一个真正的选择,因为该网站最终将成为面向公众的网站.我们需要对IE8试图加载的页面应用修复.
那么,有没有人知道IE8试图加载的页面是什么,可能会导致它这样做?
我需要使用Java API在Selenium RC中模拟tab键.
我输入一些文字后使用以下方法执行此操作:
selenium.type(input, "mytext");
Run Code Online (Sandbox Code Playgroud)
我已经尝试了3种替代方案来使标签工作:
selenium.keyPress(input, "\\9");
Run Code Online (Sandbox Code Playgroud)
和:
selenium.focus(input);
selenium.keyPressNative("09");
Run Code Online (Sandbox Code Playgroud)
乃至:
selenium.getEval("var evt = window.document.createEvent('KeyboardEvent');evt.initKeyEvent ('keypress', true, true, window,0, 0, 0, 0,0, 9,0);window.document.getElementsByTagName('input')[2].dispatchEvent(evt);")
Run Code Online (Sandbox Code Playgroud)
我能得到的最好的是在我的文本后面插入一个"标签空间",所以我在输入字段中结束了这个:
"mytext "
Run Code Online (Sandbox Code Playgroud)
我真正想要的是选择下一个控件.有线索吗?谢谢!
(注意:我必须使用tab而不能使用焦点或选择我想要去的元素,因为各种原因,所以请不要沿着这些方面提出建议!)
java ×7
algorithm ×1
berkeley-db ×1
csv ×1
date ×1
final ×1
hibernate ×1
jnlp ×1
jpa ×1
keypress ×1
linux ×1
map ×1
openjpa ×1
path ×1
performance ×1
persistence ×1
persistent ×1
search ×1
selenium ×1
selenium-rc ×1
string ×1
tabs ×1
unix ×1