如何将分隔符添加到 csv 文件

Posted

技术标签:

【中文标题】如何将分隔符添加到 csv 文件【英文标题】:How to add delimiters to a csv file 【发布时间】:2020-02-27 04:07:04 【问题描述】:

我有一个没有分隔符的 csv 文件。是否可以在 PySpark 的某个位置添加分隔符?喜欢,

我的文件看起来像:

USDINRFUTCUR23Feb201700000000FF00000000000001990067895000000000NNN*12
USDINRFUTCUR24Feb201700000000FF00000000000001990067895000000000NNN*12
USDINRFUTCUR25Feb201700000000FF00000000000001990067895000000000NNN*12

我想在第 3、6、12 位分隔符

【问题讨论】:

你不要在 python 中运行它并在那里插入分隔符。通过那条路似乎更容易 您想要 pyspark 解决方案,还是 pandas 解决方案就足够了?换句话说,你的数据有多大 一个文件大小为 GB,我有 84-90 个文件。所以,文件很大 【参考方案1】:

对于固定宽度的文件,有 pandas.read_fwf()

widths = [
    3, 
    6, 
    12, 
 ]
df = pd.read_fwf("fixed_width.txt", widths=widths)
df

【讨论】:

我试过这个,但由于数据集太长,这需要很多时间。是否有任何 pyspark 函数可以做到这一点【参考方案2】:

对于使用分布式 pyspark 解决方案,没有类似的方法可以在您阅读时添加分隔符(因为有 pandas)。解决此问题的一种可扩展方法是按原样读取一列中的数据,然后使用以下代码(使用 pyspark 函数)创建列。

创建示例数据框:

from pyspark.sql import functions as F
from pyspark.sql.types import *

list=[['USDINRFUTCUR23Feb201700000000FF00000000000001990067895000000000NNN*12'],
      ['USDINRFUTCUR24Feb201700000000FF00000000000001990067895000000000NNN*12'],
      ['USDINRFUTCUR25Feb201700000000FF00000000000001990067895000000000NNN*12']]

df=spark.createDataFrame(list,['col1'])

df.show(truncate=False)


+---------------------------------------------------------------------+
|col1                                                                 |
+---------------------------------------------------------------------+
|USDINRFUTCUR23Feb201700000000FF00000000000001990067895000000000NNN*12|
|USDINRFUTCUR24Feb201700000000FF00000000000001990067895000000000NNN*12|
|USDINRFUTCUR25Feb201700000000FF00000000000001990067895000000000NNN*12|
+---------------------------------------------------------------------+

使用 substrwithcolumn 创建新列,然后删除第一个列。您可以创建一个 def(function) 来读取并执行此代码,以便您可以重用和简化您的管道

df.withColumn("Currency1", F.col("col1").substr(0,3))\
  .withColumn("Currency2", F.col("col1").substr(4,3))\
  .withColumn("Type", F.col("col1").substr(7,6))\
  .withColumn("Time", F.expr("""substr(col1,13,length(col1))"""))\
  .drop("col1").show(truncate=False)
  #output



+---------+---------+------+---------------------------------------------------------+
|Currency1|Currency2|Type  |Time                                                     |
+---------+---------+------+---------------------------------------------------------+
|USD      |INR      |FUTCUR|23Feb201700000000FF00000000000001990067895000000000NNN*12|
|USD      |INR      |FUTCUR|24Feb201700000000FF00000000000001990067895000000000NNN*12|
|USD      |INR      |FUTCUR|25Feb201700000000FF00000000000001990067895000000000NNN*12|
+---------+---------+------+---------------------------------------------------------+

【讨论】:

以上是关于如何将分隔符添加到 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CSV 导出复制到添加了新列的 Redshift 表中?

使用雪花连接器和 COPY INTO 功能将 csv 上传到雪花时如何指定分隔符

如何使用管道分隔符导出到 .csv

WSO2 EI:在csv文件中添加管道分隔符

如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv

如何修改excel转换csv的分隔符