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

导入带长度分隔符的文本文件

  •  0
  • user42459  · 技术社区  · 6 年前

    我有一个文本文件,里面只有数字。

    例如:

    2001 31110
    199910 311
    

    其布局可以解释如下:

    1~4th numbers : Year
    5~6th numbers : Month
    7~8th numbers : Day
    9th number : Sex
    10th number : Married
    

    但是,我不能决定如何将这个文件导入stata。

    例如,如果我使用命令:

    import delimited input.txt, delimiter(??)
    

    我应该写什么 delimiter ?

    我不一定要用上面的。我只想用任何方法导入数据。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Pearly Spencer Paul Cruz    6 年前

    答案取决于你以后想对数据做什么。

    我的理解是,空格表示与日期相关的数字是一位数,而在文本文件中,只有月份或日期可以是一位数,但不能同时是两位数。此外, sex married 二进制指示器是否取数值 0 1 .

    假设以上是正确的,并且下面的数据包含在一个文件中 data.txt :

    2001 31110
    199910 311
    1983 41201
    2012121500
    

    有一种方法:

    clear 
    import delimited data.txt, delimiter(" ") stringcols(_all)  
    
    list
    
         +--------------------+
         |         v1      v2 |
         |--------------------|
      1. |       2001   31110 |
      2. |     199910     311 |
      3. |       1983   41201 |
      4. | 2012121500         |
         +--------------------+
    
    replace v2 = "0" + v2 if v2 != ""
    generate v3 = v1 + v2
    
    generate year = substr(v3, 1, 4)
    generate month = substr(v3, 5, 2)
    generate day = substr(v3, 7, 2)
    
    generate date = substr(v3, 1, 8)
    
    generate sex = substr(v3, 9, 1)
    generate married = substr(v3, 10, 1)
    
    list
         +----------------------------------------------------------------------------------+
         |         v1       v2           v3   year   month   day       date   sex   married |
         |----------------------------------------------------------------------------------|
      1. |       2001   031110   2001031110   2001      03    11   20010311     1         0 |
      2. |     199910     0311   1999100311   1999      10    03   19991003     1         1 |
      3. |       1983   041201   1983041201   1983      04    12   19830412     0         1 |
      4. | 2012121500            2012121500   2012      12    15   20121215     0         0 |
         +----------------------------------------------------------------------------------+
    

    基本上,您可以导入最多两个字符串变量中的所有内容,其中只有一个空格 " " 充当分隔符。通过添加一个 在前面。然后,在使用 substr() 函数,只需根据需要将结果变量转换为数值即可。

    例如:

    destring year month day sex married, replace
    
    generate date2 = daily(date, "YMD")
    format date2 %tdDD-NN-CCYY
    
    . list date2 
    
         +------------+
         |      date2 |
         |------------|
      1. | 11-03-2001 |
      2. | 03-10-1999 |
      3. | 12-04-1983 |
      4. | 15-12-2012 |
         +------------+
    

    如果在文本文件中,月和日都包含个位数,则遵循与上面相同的逻辑,但在导入数据之后,还需要处理第三个变量。

    推荐文章