【问题标题】:Save elements of CSV with new lines to array将带有新行的 CSV 元素保存到数组
【发布时间】:2018-01-19 00:12:22
【问题描述】:

对于一个项目,我必须使用 xml 格式通过 rest(curl)将数据从 csv 文件获取到 web 系统。 除了一件事,我几乎可以完成所有工作。

我收到的这个项目的文件是一个 .xlsx 文件。我将它导出到 .csv 文件(分隔符分隔)并将编码转换为 UTF-8。原始文件大约有 2000 行和 30 列。

我的策略是在 SLES12 SP2(它是一台测试机)。

csv 采用以下格式(简化): (注意:在一个单元格中包含三行的描述。这就是破坏我的脚本的部分。) curl 命令使用这些换行符创建虚假条目。

Simplified CSV

大约四分之一的数据有这样的描述。

导出到 csv 后,如果我用 vim 打开文件,文件是这样的:

title|description|firstname
Test|Lorem ipsum dolor sit amet,
consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat
sed diam voluptua.|Chris

这是我的简化脚本:

file="Kontakte.csv"

# Get the values from the file
arrV[1]=$(cut -d'|' -f1 "$file" | cut -d$'\n' -f2) # Title
arrV[2]=$(cut -d'|' -f2 "$file" | cut -d$'\n' -f2) # Description
arrV[3]=$(cut -d'|' -f3 "$file" | cut -d$'\n' -f2) # First name

echo "### Values ###"
# For reference
echo "Title: " ${arrV[1]}
echo "Description: " ${arrV[2]}
echo "Name: " ${arrV[3]}

我得到的是……

### Values ###
Title:  Test
Description:  Lorem ipsum dolor sit amet,
Name: Chris

... 而不是这样的:

### Values ###
Title:  Test
Description:  Lorem ipsum dolor sit amet,\n onsetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat\n sed diam voluptua.
Name: Chris

我有一个 vba 脚本来摆脱换行符,但这不是一个理想的解决方案。

最好在执行过程中加上一些引号以使其正常工作,例如:

arrV[2]="$(cut -d'|' -f2 "$file" | cut -d$'\n' -f2)"

但我无法解决这样的问题。

您有什么想法,如何处理这些新行吗?还是我唯一的选择是事先在 Excel 中删除换行符?

提前谢谢你。

【问题讨论】:

    标签: arrays bash csv newline cut


    【解决方案1】:

    您正在使用面向行的工具,因此嵌入的\n 引起麻烦也就不足为奇了。选择一个像 ~ 这样的字符,然后使用 grep 验证它没有出现在您的 .csv 中。使用 \r (Mac) 行终止符导出到 .csv。然后使用 tr & mac2unix 将换行符映射到您的保留字符并修复行终止符:

    tr '\n' '~' < Kontakte.csv | mac2unix > New.csv
    

    当您完成文件的修改后,tr '~' '\n' 将恢复事务。

    当然,最好使用适当的工具,例如 CSV 库。

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 2016-08-02
      • 1970-01-01
      • 2021-05-29
      • 2021-10-05
      • 2021-01-31
      • 2022-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多