从csv中选择具有特定值的行

时间:2016-12-03 16:49:13

标签: c# linq csv filehelpers

我在浏览CSV文件时遇到了问题,现在我正在使用Filehelpers,但我可以尝试任何可以给我答案的方法。

我有这样的CSV文件:

   001AD;1234;Window1;;;START;29-11-2016 07:32:00;;
   001AD;1234;Window1;;;STOP;29-11-2016 07:45:00;13;
   002BS;1222;;Frezowanie;;START;29-11-2016 07:53:00;;
   003MR;1243;Window2;;;START;30-11-2016 08:20:00;;
   002BS;1222;;Frezowanie;;STOP;30-11-2016 11:23:00;210;
   004DG;Oklejanie;;;;START;01-12-2016 06:33:00;;

我想只选择那些具有相同的3个第一个值但没有“STOP”等效的行。所以在这种情况下,它将是第4行和第6行。有没有选择这样做?

1 个答案:

答案 0 :(得分:1)

由于您没有明确说明您的用例,我使用的是SQLite解决方案:

首先,您必须import your CSV file

然后运行以下查询:

SQL Fiddle

SQLite(SQL.js)架构设置

CREATE TABLE t
    ("a" TEXT(5), "b" TEXT(9), "c" TEXT(7), "d" TEXT(10), "e" INTEGER, "f" TEXT(5), "g" TEXT(19), "h" INTEGER)
;

INSERT INTO t
    ("a", "b", "c", "d", "e", "f", "g", "h")
VALUES
    ('001AD', '1234', 'Window1', NULL, NULL, 'START', '29-11-2016 07:32:00', NULL)
;
-- ...

查询1

select sta.*
from (
        select * 
        from t 
        where f = "START"
    ) sta
LEFT JOIN (
        select * 
        from t 
        where f = "STOP"
    ) sto
    ON (
        sta.a = sto.a 
        OR (
            sta.a IS NULL 
            AND sto.a IS NULL
            )
        )
    AND (
        sta.b = sto.b 
        OR (
            sta.b IS NULL 
            AND sto.b IS NULL
            )
        )
    AND (
        sta.c = sto.c 
        OR (
            sta.c IS NULL 
            AND sto.c IS NULL
            )
        )
WHERE 
    sto.f IS NULL

<强> Results

|     a |         b |       c |      d |      e |     f |                   g |      h |
|-------|-----------|---------|--------|--------|-------|---------------------|--------|
| 003MR |      1243 | Window2 | (null) | (null) | START | 30-11-2016 08:20:00 | (null) |
| 004DG | Oklejanie |  (null) | (null) | (null) | START | 01-12-2016 06:33:00 | (null) |