将带有新行的 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库,那就更好了。
对于一个项目,我必须使用 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库,那就更好了。