代码之家  ›  专栏  ›  技术社区  ›  ChristianLinnell

有趣的csv格式帮助

  •  2
  • ChristianLinnell  · 技术社区  · 16 年前

    我得到了一个带有有趣的csv格式的大文件,可以解析成数据库。

    分隔符是分号( ; )如果其中一个字段包含分号,则通过将其包装为双引号“转义”,如下所示 ";" .

    我已经确信,不会有两个带有尾随/前导双引号的相邻字段,因此这种格式在技术上应该是正常的。

    现在,我在想用vbscript解析它

    1. 替换的每个实例 “;” 用GUID,
    2. 用分号将行拆分为数组,
    3. 在数组中运行,将guid替换为 “;”

    这似乎是最快的方法。有更好的方法吗?我想我可以使用子字符串,但这种方法似乎是可以接受的…

    6 回复  |  直到 16 年前
        1
  •  2
  •   paxdiablo    16 年前

    你的方法听起来不错,但要注意的是 您的guid可能会出现在文本本身中。

    在我之前使用过的这种类型的数据的方法中,只是在分号上拆分,不管怎样,如果两个相邻的字段以引号结束并开始,则合并它们。

    例如:

    Pax;is;a;good;guy";" so;says;his;wife.
    

    变成:

    0 Pax
    1 is
    2 a
    3 good
    4 guy"
    5 " so
    6 says
    7 his
    8 wife.
    

    然后,当您发现字段4和5分别以引号结束和开始时,您可以将它们组合起来,将字段4的右引号替换为分号,并删除字段5的右引号(当然,还要将它们连接起来)。

    0 Pax
    1 is
    2 a
    3 good
    4 guy; so
    5 says
    6 his
    7 wife.
    
        2
  •  1
  •   derobert    16 年前

    在伪代码中,给出:

    • 输入 :字符串,第一个字符是 输入 [ 0 ];最后 字符是 输入 [ 长度 ]此外,假设一个假人 字符, 输入 [ 长度 + 1。它可以是任何东西,除了 ; " . 这个字符串是“csv”文件的一行。

    • 长度 :正整数,中的字符数 输入

    这样做:

    • 设置 开始 = 0

    • 如果 输入 〔0〕 ';' :

      • 开始时你有一个空白字段;用它做任何事情

      • 设置开始=2

    • 菊苣

    • 对于每一个 C 在1和 长度 :

      • 下一次迭代,除非 一串 [ C = “;”

      • IF输入[C-1 ] '"' 或输入[C+1 ] “” : //测试转义序列 ";"

        • 找到半开范围的场常数[开始,c);做任何事 有了它。注意,如果是空字段,startc,leaving 空范围

        • 设置开始= C+ 1

      • 菊苣

    • 末尾

    当然,还没有测试。像这样调试代码总是很有趣的。

    特例 输入 [0]是为了确保我们永远不会看到 输入〔1〕 .如果你能 输入〔1〕 安全,那么你就可以摆脱那个特殊情况。您还可以在 输入 [0]然后开始数据和分析 输入 〔1〕。

        3
  •  1
  •   BCS    16 年前

    一种选择是查找regex的实例:

    [^"];[^"]

    然后用子字符串分隔字符串:

    List<string> ret = new List<string>();
    Regex r = new Regex(@"[^""];[^""]"); 
    Match m;
    
    while((m = r.Match(line)).Success)
    {
        ret.Add(line.Substring(0,m.Index + 1);
        line = line.Substring(m.Index + 2);
    }
    

    (抱歉,我不知道vbscript)

        4
  •  0
  •   old_timer    16 年前

    对于.csv文件,使用引号是正常的。如果您在字段中有引号,那么您可能会看到开始和结束,以及嵌入的引号都串成两个或三个一行。

        5
  •  0
  •   Community Mohan Dere    9 年前

    如果您使用的是SQL Server,那么可以尝试使用T-SQL来为您处理所有事情。

    SELECT * INTO MyTable FROM OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 
    'Data Source=F:\MyDirectory;Extended Properties="text;HDR=No"')...
    [MyCsvFile#csv]
    

    这将创建并填充“myTable”。阅读有关此主题的更多信息 here 就这样。

        6
  •  0
  •   TheJacobTaylor    16 年前

    我建议使用regex来分解字符串。

    • 查找不属于 把它换成别的东西 不会出现在您的字段中。
    • 然后,把“;”替换为;

    现在您的字段具有正确的数据。

    大多数导入程序可以很容易地交换分隔符。

    这基本上是你的指导思想。只需确保guid对您的文件是唯一的,然后您就可以开始了。我倾向于使用“z”。在足够多的z之后,你将是独一无二的(有时只有1-3个)。

    雅各伯