将带有新行的 CSV 元素保存到数组

Save elements of CSV with new lines to array

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

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

我的策略是 "cut" .csv 文件的字段并使用 bash (4.3.42) 脚本将输出保存到数组(我没有使用 Python 之前 ;) ) 在 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 我唯一的选择中预先删除换行符?

提前致谢。

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

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

当您完成文件修改后,tr '~' '\n' 将恢复原状。

当然,如果使用合适的工具,比如CSV库,那就更好了。