देखें https://git.mikael.io/mikaelhg/pg -ऑब्जेक्ट-सीएसवी-कॉपी-पीओसी/ JUnit परीक्षण वाले प्रोजेक्ट के लिए जो वही करता है जो आप चाहते हैं।
मूल रूप से, आप दो चीजों के लिए अल्पविराम का उपयोग करने में सक्षम होना चाहते हैं:सरणी वस्तुओं को अलग करने के लिए, और प्रकार के क्षेत्रों को अलग करने के लिए, लेकिन आप नहीं चाहते कि सीएसवी पार्सिंग कॉमा को फील्ड डेलिनेटर के रूप में व्याख्या करे।
तो
- आप CSV पार्सर को पूरी पंक्ति को एक स्ट्रिंग, एक फ़ील्ड मानने के लिए कहना चाहते हैं, जिसे आप सिंगल कोट्स में संलग्न करके और CSV पार्सर को इस बारे में बताकर कर सकते हैं, और
- आप चाहते हैं कि पीजी फ़ील्ड पार्सर प्रत्येक सरणी आइटम प्रकार के उदाहरण को दोहरे उद्धरण में संलग्न करने पर विचार करे।
कोड:
copyManager.copyIn("COPY my_table (addresses) FROM STDIN WITH CSV QUOTE ''''", reader);
डीएमएल उदाहरण 1:
COPY my_table (addresses) FROM STDIN WITH CSV QUOTE ''''
सीएसवी उदाहरण 1:
'{"(10.0.0.1,1)","(10.0.0.2,2)"}'
'{"(10.10.10.1,80)","(10.10.10.2,443)"}'
'{"(10.10.10.3,8080)","(10.10.10.4,4040)"}'
DML उदाहरण 2, दोहरे उद्धरण चिह्नों से बचना:
COPY my_table (addresses) FROM STDIN WITH CSV
दोहरे उद्धरण चिह्नों से बचने के लिए CSV उदाहरण 2:
"{""(10.0.0.1,1)"",""(10.0.0.2,2)""}"
"{""(10.10.10.1,80)"",""(10.10.10.2,443)""}"
"{""(10.10.10.3,8080)"",""(10.10.10.4,4040)""}"
पूर्ण जुनीट टेस्ट क्लास:
package io.mikael.poc;
import com.google.common.io.CharStreams;
import org.junit.*;
import org.postgresql.PGConnection;
import org.postgresql.copy.CopyManager;
import org.testcontainers.containers.PostgreSQLContainer;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import static java.nio.charset.StandardCharsets.UTF_8;
public class CopyTest {
private Reader reader;
private Connection connection;
private CopyManager copyManager;
private static final String CREATE_TYPE = "CREATE TYPE address AS (ip inet, port int)";
private static final String CREATE_TABLE = "CREATE TABLE my_table (addresses address[] NULL)";
private String loadCsvFromFile(final String fileName) throws IOException {
try (InputStream is = getClass().getResourceAsStream(fileName)) {
return CharStreams.toString(new InputStreamReader(is, UTF_8));
}
}
@ClassRule
public static PostgreSQLContainer db = new PostgreSQLContainer("postgres:10-alpine");
@BeforeClass
public static void beforeClass() throws Exception {
Class.forName("org.postgresql.Driver");
}
@Before
public void before() throws Exception {
String input = loadCsvFromFile("/data_01.csv");
reader = new StringReader(input);
connection = DriverManager.getConnection(db.getJdbcUrl(), db.getUsername(), db.getPassword());
copyManager = connection.unwrap(PGConnection.class).getCopyAPI();
connection.setAutoCommit(false);
connection.beginRequest();
connection.prepareCall(CREATE_TYPE).execute();
connection.prepareCall(CREATE_TABLE).execute();
}
@After
public void after() throws Exception {
connection.rollback();
}
@Test
public void copyTest01() throws Exception {
copyManager.copyIn("COPY my_table (addresses) FROM STDIN WITH CSV QUOTE ''''", reader);
final StringWriter writer = new StringWriter();
copyManager.copyOut("COPY my_table TO STDOUT WITH CSV", writer);
System.out.printf("roundtrip:%n%s%n", writer.toString());
final ResultSet rs = connection.prepareStatement(
"SELECT array_to_json(array_agg(t)) FROM (SELECT addresses FROM my_table) t")
.executeQuery();
rs.next();
System.out.printf("json:%n%s%n", rs.getString(1));
}
}
टेस्ट आउटपुट:
roundtrip:
"{""(10.0.0.1,1)"",""(10.0.0.2,2)""}"
"{""(10.10.10.1,80)"",""(10.10.10.2,443)""}"
"{""(10.10.10.3,8080)"",""(10.10.10.4,4040)""}"
json:
[{"addresses":[{"ip":"10.0.0.1","port":1},{"ip":"10.0.0.2","port":2}]},{"addresses":[{"ip":"10.10.10.1","port":80},{"ip":"10.10.10.2","port":443}]},{"addresses":[{"ip":"10.10.10.3","port":8080},{"ip":"10.10.10.4","port":4040}]}]