Ruby CSV解析带引号的字符串

时间:2015-08-10 16:57:57

标签: ruby file csv row quotes

尝试将CS​​V数据导入Active Record时出现问题。我的CSV是在Google工作表中创建的,然后以CSV格式下载。 CSV中的某些条目在某些单词周围有引号(即“逻辑”)。以下是我要编写的用于导入此数据的脚本:

<?xml version="1.0" encoding="utf-8"?>

我在rails控制台中执行脚本:

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="ANDROID.PERMISSION.CHANGE_WIFI_STATE"/>
<uses-permission android:name="ANDROID.PERMISSION.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="ANDROID.PERMISSION.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="ANDROID.PERMISSION.CHANGE_NETWORK_STATE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".SDCardImagesActivity"
        android:label="@string/app_name">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

大多数数据加载得很好,并且按照我想要的方式正确保存到数据库中。

以下是我尝试使用标头导入的数据示例:

    require 'csv'

homeDir = Dir.home
file = File.join(homeDir, "trdata-1.csv")
header = []

 CSV.foreach(file, headers: true, :quote_char => '"', encoding: "UTF-8") do |row|

  #possible cause
  possible_cause = PossibleCause.find_by_description(row["Possible Cause"]) || PossibleCause.new.tap do |possible_cause|
    # find the possible cause by its description, else make a new one.
         possible_cause.description = row.to_s.slice(row["Possible Cause"])
    #
    puts possible_cause.description
  end

  #troubleshooting paths
  troubleshooting_path = TroubleshootingPath.find_by_description(row["Troubelshooting Path"]) || TroubleshootingPath.new.tap do |troubleshooting_path|
    # Find the troubleshooting path by its description, or else make a new one.
    troubleshooting_path.description = row.to_s.slice(row["Troubleshooting Path"])

    puts possible_cause.description
  end
  possible_cause.troubleshooting_paths << troubleshooting_path

  #action steps
  action_step = ActionStep.find_by_description(row["Action Step"]) || ActionStep.new.tap do |action_step|
    action_step.description = row.to_s.slice(row["Action Step"])
    puts possible_cause.description
  end
  troubleshooting_path.action_steps << action_step

  possible_cause.save!
end

此行将炸毁脚本。 “逻辑”一词用引号括起来。我已经尝试取出引号,它会运行得很好,所以它肯定是引起问题的引号。我不知道为什么会发生这种情况并且谷歌搜索没有取得很多结果。

2 个答案:

答案 0 :(得分:2)

我相信当您阅读相应的列时,您的问题并没有转义引号,在这种情况下,&#34;行动步骤&#34;。

最简单的选择是将CSV中的双引号更改为单引号,然后运行脚本。

答案 1 :(得分:0)

您可以从说明中gsub引用"

possible_cause.description.gsub('"', '')